NAV
graphQL ruby shell

概要

このドキュメントはCarely APIの仕様について説明します。
Carely APIはGraphQLで提供されており、利用するにはアクセストークンが必要となります。

本ドキュメントでは
・アクセストークンの取得方法
・GraphQL APIへアクセスする方法

を記載しています。

改訂履歴

年月日 内容
2020年9月17日 新規作成
2021年2月18日 残業時間を追加

デモ環境・GraphiQL Explorerについて

デモ環境でCarely APIを試すことができます。

デモ環境をお使いになりたい方はデモ環境用のアカウントが必要になりますので担当者までご連絡下さい。

また、CarelyのGraphiQL Explorerを使ってGraphQLのQueryやMutationのtype, field, argumentの確認やQueryの実行を実際に試すことができます。(Mutationは実行できません)

利用するにはCarelyの管理者権限のアカウントでログインする必要があります。

Carelyデモ環境にも同様のGraphiQL Explorerの機能が存在します。

実際にアクセストークンを発行した後GraphQLのQuery, Mutationを試したい場合はAltairというGraphQL Clientアプリで実行することができます。

サンプルプログラムについて

こちらへCarelyAPI Clientのサンプルプログラムを公開しています。

アクセストークンの取得方法

アクセストークンの取得の流れは以下のようになります。

  1. OAuth2.0アプリケーションをCarely上に作成します。

  2. Client ID, Client Secret が発行されるのでこれを使い認可コードを取得します。
    その次に認可コードを使ってアクセストークンを取得します。

OAuth2.0アプリケーション作成方法

CarelyでOAuth2.0アプリケーションを作成するには管理者機能が使える権限でログインする必要があります。

以下の管理者機能のメニューから[アプリ開発]を選択します。

管理者機能メニュー

[新しいアプリを作成]をクリックします。 「アプリ名」,「コールバックURL」,「権限」を入力しアプリを作成します。

アプリ作成

アプリを作成すると下の画面のように Client IDClient Secret が発行されWEBアプリ認証用URLが表示されます。

アプリ情報

認可コード、アクセストークン取得について

現時点ではOAuth2.0のAuthorization Code Grant Flowのみをサポートしており、トークン取得は以下の手順にて行います。

・OAuth2.0アプリケーションの作成で発行したClient IDClient Secret を用いて、認可コードを取得します。

・認可コードを使ってアクセストークンを取得します。

1. エンドポイントについて

認可エンドポイント
https://auth.carely.io/corporate_manager/oauth/authorize

トークンエンドポイント
https://auth.carely.io/corporate_manager/oauth/token

2 スコープについて

アクセストークンの持つスコープによって、利用できるAPIが決まります。

API 必要なスコープ
従業員情報に関わるGraphQLのQuery customer:read[従業員の参照]
従業員情報に関わるGraphQLのMutation customer:read[従業員の参照] と customer:write[従業員の更新]
残業時間情報に関わるGraphQLのQuery customer:read[従業員の参照] と overtime:read[残業時間の参照]
残業時間情報に関わるGraphQLのMutation customer:read[従業員の参照] と overtime:write[残業時間の更新]

customer:read[従業員の参照]権限は必須権限のためデフォルトで付属しています。

3. 認可コードの取得について

OAuth2.0アプリケーションを作成したときWEBアプリ認証用URLが表示されているのでユーザのアプリケーションよりこれにリダイレクトします。 URLの構成を右側のshellのタブに記載しています。

# 認可コード取得用URL
GET 
https://auth.carely.io/corporate_manager/oauth/authorize
  ?client_id={CLIENT_ID}
  &response_type=code
  &scope={スコープ}
  &redirect_uri={コールバックURL}
  &state={任意の文字列}
パラメータ
client_id 登録したアプリケーションのClient ID
response_type codeを指定
scope 登録したアプリケーションのスコープ(詳細は「2.3 スコープ」を参照して下さい)
redirect_uri 登録したアプリケーションのコールバックURL
state 任意の文字列

WEBアプリ認証用URLへアクセスすると下のような画面が表示されます。
認可画面へのアクセスには管理者権限が必要です。

[認可画面]

認可画面

「許可する」をクリックすると登録したコールバックURLへ認可コードが返ります。

4. アクセストークン取得について

3で取得した認可コードを使ってアクセストークン情報を取得します。
curlを使ってアクセストークンを取得するコマンドを右側のshellのタブへ記載しています。

# curlを使ってアクセストークンを取得するコマンド
$ curl -X POST https://auth.carely.io/corporate_manager/oauth/token \
  -d "client_id={Client ID}" \
  -d "client_secret={Client Secret}" \
  -d "code={認可コード}" \
  -d "grant_type=authorization_code" \
  -d "redirect_uri={コールバックURL}"

# コマンド実行結果例
{
  "access_token":"10VgAbFkRoh4HxhhDkr3ytnF_KcITzrodPW3_xQpdpk",
  "token_type":"Bearer",
  "expires_in":86400,
  "refresh_token":"bFqxUc8Xe3EIBVNDaixbp2uAfiOuGZIjDRJtv5RuIC8",
  "scope":"customer:read customer:write",
  "created_at":1594375406
}

4.1 アクセストークンの取得に必要なパラメータ

パラメータ
client_id 登録したアプリケーションのClient ID
client_secret 登録したアプリケーションのClient Secret
code コールバックURLで受け取った認可コード
grant_type 文字列でauthorization_codeを指定
redirect_uri 登録したアプリケーションのコールバックURL

レスポンス(json形式)

パラメータ
acces_token アクセストークン
token_type bearer
expires_in 86400
refresh_token リフレッシュトークン
scope アクセストークンが持つスコープ(半角スペース区切り)
created_at アクセストークンの生成日時(UNIXタイムスタンプ)

4.2 rubyでアクセストークンを取得するまでのサンプルコード

rubyでoauth2のgemを使って

をおこなうサンプルコードが右側のrubyのタブにあるので参考にして下さい。

# rubyでアクセストークンを取得するまでのサンプルコード
# gem oauth2を使ってWEBアプリ認証用URLを作成 → 認可コード取得 → アクセストークン取得する

require 'oauth2'

client_id = "client idを記述"
client_secret = "client secretを記述"

oauth2_client = OAuth2::Client.new(
  client_id,
  client_secret,
  site: "https://auth.carely.io/",
  authorize_url: "corporate_manager/oauth/authorize",
  token_url: "corporate_manager/oauth/token",
  raise_errors: false
)

# WEBアプリ認証用URLを生成する
authorize_url = oauth2_client.auth_code.authorize_url(
  redirect_uri: "設定したコールバックURLを入れて下さい",
  scope: "対応するscopeを入れて下さい",
  state: "検証用の値を入れて下さい"
)

# authorize_urlへアクセスすると左の画面が表示されます
redirect_to authorize_url

# 「許可する」をクリック後、設定したコールバックURLへ返ってきたときの処理
#  WEBアプリ認証用URLを生成するときにstateを設定した場合は params[:state] が正しいかチェックして下さい

# params[:code] へ認可コードが入っているのでこれを使ってアクセストークンを要求します
response_data = oauth2_client.auth_code.get_token(
  params[:code],
  redirect_uri: "設定したコールバックURLを入れて下さい"
)
# アクセストークン
access_token = response_data.token
# リフレッシュトークン
refresh_token = response_data.refresh_token
# アクセストークンの有効期限
expires_in = response_data.expires_in

5 アクセストークンによる認証

アクセストークンを取得後、以下のように Authorization リクエストヘッダに Bearer タイプとしてアクセストークンを指定してAPIを呼び出します。

Authorization: Bearer アクセストークン

アクセストークンの有効期限は24時間となっています。
有効期限を過ぎた場合は右のようなエラー情報を含んだresponseを返します。

# アクセストークンの有効期限エラーの場合
{ "errors" => [ {"message" => "401 Unauthorized"} ] }

リフレッシュトークン

アクセストークンの有効期限が切れた場合はリフレッシュトークンを使用して新しいトークンを取得してください。

curlを使ってリフレッシュトークンからアクセストークンを取得するコマンドが右側のshellのタブにあるので参考にして下さい。

rubyでoauth2のgemを使ってリフレッシュトークンからアクセストークンを取得するサンプルコードが右側のrubyのタブにあるので参考にして下さい。

# curlによりリフレッシュトークンを使用して新しいアクセストークンを取得するコマンド
$ curl -X POST https://auth.carely.io/corporate_manager/oauth/token \
  -d "client_id={Client ID}" \
  -d "client_secret={Client Secret}" \
  -d "refresh_token={refresh token}" \
  -d "grant_type=refresh_token"

# コマンド実行結果例
{
  "access_token": "OqBWs3Rad-aOF8LaLKNyQSLx6vLKtJMFHYh-SCzO7VQ",
  "token_type":"Bearer",
  "expires_in":86400,
  "refresh_token":"Di50ICxQWkomILKN6VI59rJUsw3U9EC-9RJIUyFmq-I",
  "scope":"customer:read customer:write overtime:read overtime:write",
  "created_at":1631511679
 }
# rubyでリフレッシュトークンからアクセストークンを取得するまでのサンプルコード

require 'oauth2'

client_id = "client idを記述"
client_secret = "client secretを記述"

client = OAuth2::Client.new(
  client_id,
  client_secret,
  site: "https://auth.carely.io/",
  authorize_url: "corporate_manager/oauth/authorize",
  token_url: "corporate_manager/oauth/token",
  raise_errors: false
)

oauth2_access_token = OAuth2::AccessToken.new(
  client,
  access_token,
  { refresh_token: refresh_token } # 取得済みの refresh_token を入れて下さい
)

new_token = oauth2_access_token.refresh!

# アクセストークン
access_token = new_token.token
# リフレッシュトークン
refresh_token = new_token.refresh_token
# アクセストークンの有効期限
expires_in = new_token.expires_in

トークン イントロスペクション

トークンの状態を確認するためには以下のエンドポイントへリクエストを送信して下さい。 curlを使ってリクエストするコマンドを右側のshellのタブに記載しています。

エンドポイント
https://auth.carely.io/corporate_manager/oauth/introspect

# curlを使ってトークン イントロスペクション エンドポイントへリクエストを送信するコマンド
curl -X POST https://auth.carely.io/corporate_manager/oauth/introspect \
  -d "client_id={Client ID}" \
  -d "client_secret={Client Secret}" \
  -d "token={アクセストークン}" \
  -d "refresh_token={リフレッシュトークン}"

# コマンド実行結果例
# アクセストークンの有効期限内の場合
{ "active":true,
  "scope":"customer:read customer:write",
  "client_id":"CLIENT ID",
  "token_type":"Bearer",
  "exp":1596701471,
  "iat":1596615071
}

# アクセストークンの有効期限が切れている場合
{ "active":false }

アクセストークンの利用停止

アクセストークンを無効にする場合には以下のエンドポイントへリクエストを送信して下さい。 curlを使ってリクエストするコマンドを右側のshellのタブに記載しています。

エンドポイント
https://auth.carely.io/corporate_manager/oauth/revoke

# curlを使ってアクセストークンの利用停止をおこなうエンドポイントへリクエストを送信するコマンド
curl -X POST https://auth.carely.io/corporate_manager/oauth/revoke \
  -d "client_id={Client ID}" \
  -d "client_secret={Client Secret}" \
  -d "token={アクセストークン}" \
  -d "refresh_token={リフレッシュトークン}"

# コマンド実行結果例
# 特にレスポンスにデータは返ってこないので
# トークンイントロスペクションのエンドポイントへリクエストを送信して利用停止されたことを確認してください
{}

Carely GraphQL APIへのアクセスについて

リクエストヘッダ

Carely GraphQL APIへアクセスするには以下のリクエストヘッダ情報を指定してリクエストしてください。

エンドポイント

Carely GraphQL APIのエンドポイントは以下になります。

デモ環境のエンドポイント:

Carely GraphQL APIで可能なこと

(上記はアクセストークンに紐づいた登録グループの範囲内で可能です)

Carely GraphQL APIで不可能なこと

(ただし、従業員情報変更、新規作成時に存在しない部署名 or 事業場名 or 集団分析単位名を指定すると自動的に新規作成されます。)

GraphQL Pagination

Carely GraphQL APIのPaginationではRelay Cursor Connectionsを採用しています。

オブジェクト名 + Connection(ex. CustomerConnection)と表示されているオブジェクトに関してはRelay Cursor Connectionsを採用しています。
詳細はリンク先のドキュメントをご確認下さい。

Carely GraphQL APIで使用されるデータについて

Carely GraphQL APIで使用されるデータのTypesには以下の種類があります。

意味
Customer 従業員情報
名前や社員番号、部署など従業員に関する情報です
Overtime 残業時間情報
残業の時間や該当月など残業時間に関する情報です
Branch 登録グループ情報
セキュリティを分ける際のグループとなります
CurrentCustomer 現在のアクセストークンに紐づく従業員情報とアクセスできる登録グループに関する情報です
Department 部署情報
Workplace 事業場情報
労基署への報告単位のグループとなります
GroupAnalysis 集団分析単位情報
ストレスチェックの集団分析をおこなう時のグループとなります

各Typesの詳細な項目に関しては GraphiQL Explorerを参照してください。

またデータの取得については以下のGraphQL Queryを提供しています。

Query Name 説明
CurrentCustomer Query 現在のアクセストークンに紐づく従業員情報とアクセスできる登録グループに関する情報の取得
Customer Query 従業員情報の取得
Overtime Query 残業時間情報の取得
Department Query 部署情報の取得
Workplace Query 事業場情報の取得
GroupAnalysis Query 集団分析単位情報の取得

それぞれのQueryのサンプルと実行結果は以下を参考にして下さい。

CurrentCustomer Query の例

現在のアクセストークンに紐づく従業員情報とアクセスできる登録グループに関する情報の取得

graphQLのqueryのサンプルを右側のgraphQLのタブに記載しています。

query CurrentCustomer {
  currentCustomer {
    branches {
      displayName
      uuid
    }
    customer {
      age
      bio
      bornOn
      branch {
        displayName
        uuid
      }
      department {
        displayName
        uuid
      }
      email
      employeeNumber
      employmentStatus
      employmentStatusText
      errors
      fullname
      fullnameJa
      gender
      genderText
      jobTitle
      joinOn
      uuid
      workingArrangement
      workplace {
        name
        uuid
      }
    }
  }
}
// query実行結果
{
  "data": {
    "currentCustomer": {
      "branches": [
        {
          "displayName": "大阪支社",
          "uuid": "5000d1b1-114b-4c17-b9ce-364a82fda0f5"
        },
        {
          "displayName": "東京支社",
          "uuid": "3bdd3daf-b6c2-4e50-9cc6-015f51a488ad"
        }
      ],
      "customer": {
        "age": "40",
        "bio": null,
        "bornOn": "1980-06-09",
        "branch": {
          "displayName": "東京支社",
          "uuid": "3bdd3daf-b6c2-4e50-9cc6-015f51a488ad"
        },
        "department": {
          "displayName": "人事総務部  西日本人事部",
          "uuid": "ad6a0a7c-e62e-4297-b85e-c5ad64913581"
        },
        "email": "demo-account+503@example.com",
        "employeeNumber": "503",
        "employmentStatus": "normal",
        "employmentStatusText": "通常勤務",
        "errors": null,
        "fullname": "人事 実施事務 支社郎",
        "fullnameJa": "じんじ じっしじむ ししゃろう",
        "gender": "male",
        "genderText": "男",
        "jobTitle": "オペレーター",
        "joinOn": "2000-12-24",
        "uuid": "6d72ec3a-f559-4b50-8848-88125fe67be7",
        "workingArrangement": "正社員",
        "workplace": {
          "name": "新宿",
          "uuid": "dc4ff8be-5dfd-4161-a3e5-094b543bd08c"
        }
      }
    }
  }
}

Customers Query の例

従業員情報の取得

graphQLのqueryのサンプルを右側のgraphQLのタブに記載しています。

query Customers {
  customers {
    pageInfo {
      startCursor
      endCursor
      hasNextPage
      hasPreviousPage
    }
    edges {
      cursor
      node {
        age
        bio
        bornOn
        branch {
          displayName
          uuid
        }
        department {
          customersCount
          displayName
          uuid
        }
        email
        employeeNumber
        employmentStatus
        employmentStatusText
        errors
        fullname
        fullnameJa
        gender
        genderText
        groupAnalysis {
          displayName
          uuid
        }
        jobTitle
        joinOn
        profilePicturePath
        uuid
        workingArrangement
        workplace {
          customersCount
          name
          uuid
        }
        hasStressCheck
        hasStressCheckText
        healthcheckUnionName
        healthInsuranceNumber
        healthInsuranceSymbol
        insuranceCardName
        insuranceCardNameJa
        retireOn
      }
    }
  }
}
// query実行結果
{
  "data": {
    "customers": {
      "pageInfo": {
        "startCursor": "MQ",
        "endCursor": "MTAw",
        "hasNextPage": true,
        "hasPreviousPage": false
      },
      "edges": [
        {
          "cursor": "MQ",
          "node": {
            "age": "36",
            "bio": null,
            "bornOn": "1984-01-30",
            "branch": {
              "displayName": "東京支社",
              "uuid": "3bdd3daf-b6c2-4e50-9cc6-015f51a488ad"
            },
            "department": {
              "customersCount": 12,
              "displayName": "営業本部",
              "uuid": "bd8d345f-1025-450b-9763-c084c6a0d6eb"
            },
            "email": "demo-account+101@example.com",
            "employeeNumber": "101",
            "employmentStatus": "normal",
            "employmentStatusText": "通常勤務",
            "errors": null,
            "fullname": "従業員 太郎",
            "fullnameJa": "じゅうぎょういん たろう",
            "gender": "male",
            "genderText": "男",
            "groupAnalysis": {
              "displayName": "集団分析1",
              "uuid": "449b2ed1-8984-4e19-bcac-49309b11d2bc"
            },
            "jobTitle": null,
            "joinOn": null,
            "profilePicturePath": null,
            "uuid": "c6775de9-b38e-412d-831c-1f0be0d94874",
            "workingArrangement": "正社員",
            "workplace": {
              "customersCount": 125,
              "name": "渋谷",
              "uuid": "e60e2560-68d6-4399-a535-d8fa6630dce2"
            },
            "hasStressCheck": "active",
            "hasStressCheckText": "有効",
            "healthcheckUnionName": "全国健康保険協会",
            "healthInsuranceNumber": "1234567890",
            "healthInsuranceSymbol": "1234567890",
            "insuranceCardName": "従業員 太郎",
            "insuranceCardNameJa": "じゅうぎょういん たろう",
            "retireOn": null
          }
        },
       ・・省略・・
      ]
    }
  }
}

Customers Query で社員番号で検索した場合の例

graphQLのqueryのサンプルを右側のgraphQLのタブに記載しています。

query Customers {
  customers(employeeNumbers: ["501", "503"]) {
    pageInfo {
      startCursor
      endCursor
      hasNextPage
      hasPreviousPage
    }
    edges {
      cursor
      node {
        age
        bio
        bornOn
        branch {
          displayName
          uuid
        }
        department {
          customersCount
          displayName
          uuid
        }
        email
        employeeNumber
        employmentStatus
        employmentStatusText
        errors
        fullname
        fullnameJa
        gender
        genderText
        groupAnalysis {
          displayName
          uuid
        }
        jobTitle
        joinOn
        profilePicturePath
        uuid
        workingArrangement
        workplace {
          customersCount
          name
          uuid
        }
        hasStressCheck
        hasStressCheckText
        healthcheckUnionName
        healthInsuranceNumber
        healthInsuranceSymbol
        insuranceCardName
        insuranceCardNameJa
        retireOn
      }
    }
  }
}
// query実行結果
{
  "data": {
    "customers": {
      "pageInfo": {
        "startCursor": "MQ",
        "endCursor": "Mg",
        "hasNextPage": false,
        "hasPreviousPage": false
      },
      "edges": [
        {
          "cursor": "MQ",
          "node": {
            "age": "40",
            "bio": null,
            "bornOn": "1980-05-09",
            "branch": {
              "displayName": "東京支社",
              "uuid": "3bdd3daf-b6c2-4e50-9cc6-015f51a488ad"
            },
            "department": {
              "customersCount": 17,
              "displayName": "営業本部 東日本営業部",
              "uuid": "4175bcc5-6ade-49ea-9b2f-6c1b7a04f911"
            },
            "email": "demo-account+501@example.com",
            "employeeNumber": "501",
            "employmentStatus": "normal",
            "employmentStatusText": "通常勤務",
            "errors": null,
            "fullname": "人事 実施事務 太郎",
            "fullnameJa": "じんじ じっしじむ たろう",
            "gender": "male",
            "genderText": "男",
            "groupAnalysis": {
              "displayName": "集団分析2",
              "uuid": "b3fcc5af-c591-44b7-8dc3-3237e8795c82"
            },
            "jobTitle": null,
            "joinOn": null,
            "profilePicturePath": null,
            "uuid": "191c1fb7-b8b5-4018-b49b-a91c95232965",
            "workingArrangement": "正社員",
            "workplace": {
              "customersCount": 125,
              "name": "渋谷",
              "uuid": "e60e2560-68d6-4399-a535-d8fa6630dce2"
            },
            "hasStressCheck": "active",
            "hasStressCheckText": "有効",
            "healthcheckUnionName": "全国健康保険協会",
            "healthInsuranceNumber": "1234567890",
            "healthInsuranceSymbol": "1234567890",
            "insuranceCardName": "人事 実施事務 太郎",
            "insuranceCardNameJa": "じんじ じっしじむ たろう",
            "retireOn": null
          }
        },
        {
          "cursor": "Mg",
          "node": {
            "age": "40",
            "bio": null,
            "bornOn": "1980-06-09",
            "branch": {
              "displayName": "東京支社",
              "uuid": "3bdd3daf-b6c2-4e50-9cc6-015f51a488ad"
            },
            "department": {
              "customersCount": 1,
              "displayName": "人事総務部  西日本人事部",
              "uuid": "ad6a0a7c-e62e-4297-b85e-c5ad64913581"
            },
            "email": "demo-account+503@example.com",
            "employeeNumber": "503",
            "employmentStatus": "normal",
            "employmentStatusText": "通常勤務",
            "errors": null,
            "fullname": "人事 実施事務 支社郎",
            "fullnameJa": "じんじ じっしじむ ししゃろう",
            "gender": "male",
            "genderText": "男",
            "groupAnalysis": {
              "displayName": "集団分析2",
              "uuid": "b3fcc5af-c591-44b7-8dc3-3237e8795c82"
            },
            "jobTitle": "オペレーター",
            "joinOn": "2000-12-24",
            "profilePicturePath": null,
            "uuid": "6d72ec3a-f559-4b50-8848-88125fe67be7",
            "workingArrangement": "正社員",
            "workplace": {
              "customersCount": 2,
              "name": "新宿",
              "uuid": "dc4ff8be-5dfd-4161-a3e5-094b543bd08c"
            },
            "hasStressCheck": "active",
            "hasStressCheckText": "有効",
            "healthcheckUnionName": "全国健康保険協会",
            "healthInsuranceNumber": "1234567890",
            "healthInsuranceSymbol": "1234567890",
            "insuranceCardName": "人事 実施事務 支社郎",
            "insuranceCardNameJa": "じんじ じっしじむ ししゃろう",
            "retireOn": null
          }
        }
      ]
    }
  }
}

Departments Query の例

部署情報の取得

graphQLのqueryのサンプルを右側のgraphQLのタブに記載しています。

query Departments {
  departments {
    customersCount
    displayName
    uuid
  }
}
// query実行結果
{
  "data": {
    "departments": [
      {
        "customersCount": 12,
        "displayName": "営業本部",
        "uuid": "bd8d345f-1025-450b-9763-c084c6a0d6eb"
      },
      {
        "customersCount": 16,
        "displayName": "営業本部 東日本営業部",
        "uuid": "4175bcc5-6ade-49ea-9b2f-6c1b7a04f911"
      },
      {
        "customersCount": 10,
        "displayName": "人事総務部",
        "uuid": "06ddbf51-0c94-4e96-aa33-2ceaa0167018"
      },
      {
        "customersCount": 10,
        "displayName": "人事総務部 東日本人事部",
        "uuid": "d0f0336e-2bb8-45f7-93aa-e2637bacb32d"
      },
      {
        "customersCount": 10,
        "displayName": "財務経理部",
        "uuid": "d10e4390-7e8e-4faa-9dec-0b5fedaf727f"
      },
      ・・省略・・
    ]
  }
}

Departments Query で登録グループ名で検索した場合の例

graphQLのqueryのサンプルを右側のgraphQLのタブに記載しています。

query Departments {
  departments(branchNames:["大阪支社"]) {
    customersCount
    displayName
    uuid
  }
}
// query実行結果
{
  "data": {
    "departments": [
      {
        "customersCount": 5,
        "displayName": "人事総務部  西日本人事部",
        "uuid": "ad6a0a7c-e62e-4297-b85e-c5ad64913581"
      },
      {
        "customersCount": 2,
        "displayName": "営業本部 西日本営業部",
        "uuid": "463b56e8-fea6-4fd8-8037-98d0cc6fe6b4"
      }
    ]
  }
}

Workplaces Query の例

事業場情報の取得

graphQLのqueryのサンプルを右側のgraphQLのタブに記載しています。

query Workplaces {
  workplaces {
    customersCount
    name
    uuid
  }
}
// query実行結果
{
  "data": {
    "workplaces": [
      {
        "customersCount": 20,
        "name": "梅田",
        "uuid": "5732bfb3-ec7f-420a-a9f6-109d8928d0ac"
      },
      {
        "customersCount": 20,
        "name": "難波",
        "uuid": "0724b232-1cfa-49e0-b88a-ecf45df75ee5"
      },
      {
        "customersCount": 20,
        "name": "新宿",
        "uuid": "dc4ff8be-5dfd-4161-a3e5-094b543bd08c"
      },
      {
        "customersCount": 30,
        "name": "銀座",
        "uuid": "95523338-452a-429d-bf4b-f764308b51ca"
      },
      {
        "customersCount": 40,
        "name": "渋谷",
        "uuid": "e60e2560-68d6-4399-a535-d8fa6630dce2"
      }
    ]
  }
}

Workplaces Query で登録グループ名で検索した場合の例

graphQLのqueryのサンプルを右側のgraphQLのタブに記載しています。

query Workplaces {
  workplaces(branchNames:["大阪支社"]) {
    customersCount
    name
    uuid
  }
}
// query実行結果
{
  "data": {
    "workplaces": [
      {
        "customersCount": 20,
        "name": "梅田",
        "uuid": "5732bfb3-ec7f-420a-a9f6-109d8928d0ac"
      },
      {
        "customersCount": 20,
        "name": "難波",
        "uuid": "0724b232-1cfa-49e0-b88a-ecf45df75ee5"
      }
    ]
  }
}

GroupAnalysis Query の例

集団分析単位情報の取得

graphQLのqueryのサンプルを右側のgraphQLのタブに記載しています。

query groupAnalysis {
  groupAnalysis {
    displayName
    uuid
  }
}
// query実行結果
{
  "data": {
    "groupAnalysis": [
      {
        "displayName": "集団分析1",
        "uuid": "449b2ed1-8984-4e19-bcac-49309b11d2bc"
      },
      {
        "displayName": "集団分析2",
        "uuid": "b3fcc5af-c591-44b7-8dc3-3237e8795c82"
      }
    ]
  }
}

GroupAnalysis Query で登録グループ名で検索した場合の例

graphQLのqueryのサンプルを右側のgraphQLのタブに記載しています。

query groupAnalysis {
  groupAnalysis(branchNames:["大阪支社"]) {
    displayName
    uuid
  }
}
// query実行結果
{
  "data": {
    "groupAnalysis": [
      {
        "displayName": "集団分析3",
        "uuid": "3861ceb5-371f-4d14-9e7b-5c9fc644c6fb"
      }
    ]
  }
}

Customer Mutation について

customer mutation実行時の項目、注意点を記載します。

input field 項目名 必須 注意点
bio 自己紹介文
bornOn 生年月日 yyyy-mm-dd or
yyyymmdd 形式で指定して下さい
branchUuid 登録グループUUID [新規登録時]
BranchUuidbranchNameのどちらか必須
branchName 登録グループ名 [新規登録時]
BranchUuidbranchName
のどちらか必須
departmentName 部署名 部署指定時は
departmentUuiddepartmentName
のどちらかを指定して下さい
departmentUuid 部署UUID 部署指定時は
departmentUuiddepartmentName
のどちらかを指定して下さい
email メールアドレス [新規登録時]必須
employeeNumber 社員番号 [新規登録時]必須
employmentStatus 就業ステータス [新規登録時]指定がない場合はnormal(通常勤務)となります
fullname 本名 [新規登録時]必須
fullnameJa 本名(読み)
gender 性別 [新規登録時]必須
groupAnalysisName 集団分析単位名 集団分析単位指定時は
groupAnalysisUuidgroupAnalysisName
のどちらかを指定して下さい
groupAnalysisUuid 集団分析単位UUID 集団分析単位指定時は
groupAnalysisUuidgroupAnalysisName
のどちらかを指定して下さい
hasStressCheck ストレスチェックの対象かどうか [新規登録時]指定がない場合はactive(対象)となります
jobTitle 役職
joinOn 入社年月日 yyyy-mm-dd or
yyyymmdd 形式で指定して下さい
retireOn 退職日 yyyy-mm-dd or
yyyymmdd 形式で指定して下さい
profilePicture プロフィール写真 「プロフィール写真の登録について」をご確認下さい
removeProfilePicture プロフィール写真削除フラグ プロフィール写真を削除する場合はtrueをセットして下さい
uuid UUID [更新時]必須 データ更新時はuuidより該当従業員を特定し更新処理をおこないます。
uuidが存在しない場合は新規登録とみなされます
workingArrangement 業務形態
workplaceUuid 事業場UUID 事業場指定時は
workplaceUuidworkplaceName
のどちらかを指定して下さい
workplaceName 事業場名 事業場指定時は
workplaceUuidworkplaceName
のどちらかを指定して下さい
healthInsuranceSymbol 保険証記号
healthInsuranceNumber 保険証番号
healthcheckUnionName 健保名

gender[性別]の値はmalefemaleのどちらかを指定して下さい。

employmentStatus[就業ステータス]の値は
normallimitedabsentretireexpired
のいずれかを指定して下さい。
(それぞれ和名で通常勤務就業制限中休職中休職中退職契約終了となります)

hasStressCheck[ストレスチェックの対象かどうか]の値は
activein_active
のいずれかを指定して下さい。
(それぞれ和名で有効無効となります)

departmentName[部署名]を指定した場合に存在しない部署名であれば新規に登録されます。

groupAnalysisName[集団分析単位名]を指定した場合に存在しない集団分析単位名であれば新規に登録されます。

workplaceName[事業場名]を指定した場合に存在しない事業場名であれば新規に登録されます。

新規従業員登録時に招待メールが送信されます。

従業員情報変更時はタイムラインに表示されません。

新規登録時のCustomer Mutation の例

Customerの新規登録時はQuery VariablesへbranchUuid or branchNameのどちらかを指定して下さい。

graphQLのmutationのサンプルを右側のgraphQLのタブに記載しています。

mutation upsertCustomer($customerInput: CustomerInput!) {
  upsertCustomer(customerInput: $customerInput) {
    age
    bio
    bornOn
    branch {
      displayName
      uuid
    }
    department {
      customersCount
      displayName
      uuid
    }
    email
    errors
    employeeNumber
    employmentStatus
    employmentStatusText
    fullname
    fullnameJa
    gender
    genderText
    groupAnalysis {
      displayName
      uuid
    }
    hasStressCheck
    hasStressCheckText
    joinOn
    jobTitle
    profilePicturePath
    uuid
    workplace {
      customersCount
      name
      uuid
    }
    workingArrangement
  }
}
// Query Variables
{
  "customerInput": {
    "branchUuid": "5000d1b1-114b-4c17-b9ce-364a82fda0f5",
    "bio": "自己紹介",
    "bornOn": "2000-01-01",
    "departmentUuid": "463b56e8-fea6-4fd8-8037-98d0cc6fe6b4",
    "email": "dummy.mail@example.com",
    "employeeNumber": "dummy0001",
    "employmentStatus": "normal",
    "fullname": "山田 太郎",
    "fullnameJa": "やまだ たろう",
    "gender": "male",
    "groupAnalysisUuid": "3861ceb5-371f-4d14-9e7b-5c9fc644c6fb",
    "hasStressCheck": "active",
    "joinOn": "2020-01-01",
    "jobTitle": "エンジニア",
    "workplaceUuid": "5732bfb3-ec7f-420a-a9f6-109d8928d0ac",
    "workingArrangement": "正社員"
  }
}
// query実行結果
{
  "data": {
    "upsertCustomer": {
      "age": "20",
      "bio": "自己紹介",
      "bornOn": "2000-01-01",
      "branch": {
        "displayName": "大阪支社",
        "uuid": "5000d1b1-114b-4c17-b9ce-364a82fda0f5"
      },
      "department": {
        "customersCount": 2,
        "displayName": "営業本部 西日本営業部",
        "uuid": "463b56e8-fea6-4fd8-8037-98d0cc6fe6b4"
      },
      "email": "dummy.mail@example.com",
      "errors": null,
      "employeeNumber": "dummy0001",
      "employmentStatus": "normal",
      "employmentStatusText": "通常勤務",
      "fullname": "山田 太郎",
      "fullnameJa": "やまだ たろう",
      "gender": "male",
      "genderText": "男",
      "groupAnalysis": {
        "displayName": "集団分析3",
        "uuid": "3861ceb5-371f-4d14-9e7b-5c9fc644c6fb"
      },
      "hasStressCheck": "active",
      "hasStressCheckText": "有効",
      "joinOn": "2020-01-01",
      "jobTitle": "エンジニア",
      "profilePicturePath": null,
      "uuid": "1e280cee-1f1a-4e34-be3f-0a3a13558cf7",
      "workplace": {
        "customersCount": 1,
        "name": "梅田",
        "uuid": "5732bfb3-ec7f-420a-a9f6-109d8928d0ac"
      },
      "workingArrangement": "正社員"
    }
  }
}

更新時の場合

Customerの更新時はQuery Variablesへ対象となる従業員のuuidを指定して下さい。

graphQLのmutationのサンプルを右側のgraphQLのタブに記載しています。

mutation upsertCustomer($customerInput: CustomerInput!) {
  upsertCustomer(customerInput: $customerInput) {
    age
    bio
    bornOn
    branch {
      displayName
      uuid
    }
    department {
      displayName
      uuid
      customersCount
    }
    email
    errors
    employeeNumber
    employmentStatus
    employmentStatusText
    fullname
    fullnameJa
    gender
    genderText
    groupAnalysis {
      displayName
      uuid
    }
    hasStressCheck
    hasStressCheckText
    joinOn
    jobTitle
    profilePicturePath
    uuid
    workplace {
      name
      uuid
    }
    workingArrangement
  }
}
// Query Variables
{
  "customerInput": {
    "uuid":"1e280cee-1f1a-4e34-be3f-0a3a13558cf7",
    "departmentName": "人事総務部 西日本人事部"
  }
}
// query実行結果
{
  "data": {
    "upsertCustomer": {
      "age": "20",
      "bio": "自己紹介",
      "bornOn": "2000-01-01",
      "branch": {
        "displayName": "大阪支社",
        "uuid": "5000d1b1-114b-4c17-b9ce-364a82fda0f5"
      },
      "department": {
        "displayName": "人事総務部 西日本人事部",
        "uuid": "ad6a0a7c-e62e-4297-b85e-c5ad64913581",
        "customersCount": 4
      },
      "email": "dummy.mail@example.com",
      "errors": null,
      "employeeNumber": "dummy0001",
      "employmentStatus": "normal",
      "employmentStatusText": "通常勤務",
      "fullname": "山田 太郎",
      "fullnameJa": "やまだ たろう",
      "gender": "male",
      "genderText": "男",
      "groupAnalysis": {
        "displayName": "集団分析3",
        "uuid": "3861ceb5-371f-4d14-9e7b-5c9fc644c6fb"
      },
      "hasStressCheck": "active",
      "hasStressCheckText": "有効",
      "joinOn": "2020-01-01",
      "jobTitle": "エンジニア",
      "profilePicturePath": null,
      "uuid": "1e280cee-1f1a-4e34-be3f-0a3a13558cf7",
      "workplace": {
        "name": "梅田",
        "uuid": "5732bfb3-ec7f-420a-a9f6-109d8928d0ac"
      },
      "workingArrangement": "正社員"
    }
  }
}

登録グループ(branch)を変更する場合

所属する登録グループを変更する場合はQuery Variablesへ対象となる従業員のuuidと変更後のbranchUuid or branchName を指定して下さい。

また、登録グループ(branch)を変更する際に部署(departmentUuid or departmentName)集団分析単位(groupAnalysisUuid or groupAnalysisName)事業場(workplaceUuid or workplaceName) は変更後のデータを指定して下さい。

指定がない場合は空(null)で登録されます。

また、部署名(departmentName)、集団分析単位名(groupAnalysisName)、事業場名(workplaceName)を指定した場合、変更後の登録グループへ存在しない場合は新規に登録されます。
(※departmentUuidgroupAnalysisUuidworkplaceUuidを指定した場合、変更後の登録グループへ存在しない場合はエラーを返します)

graphQLのmutationのサンプルを右側のgraphQLのタブに記載しています。

groupAnalysisUuidを指定し、departmentNameには新規部署を指定、workplaceの情報は指定していません。 workplaceは指定されていなかったので実行結果では空(null)となっています。

mutation upsertCustomer($customerInput: CustomerInput!) {
  upsertCustomer(customerInput: $customerInput) {
    age
    bio
    bornOn
    branch {
      displayName
      uuid
    }
    department {
      customersCount
      displayName
      uuid
    }
    email
    errors
    employeeNumber
    employmentStatus
    employmentStatusText
    fullname
    fullnameJa
    gender
    genderText
    groupAnalysis {
      displayName
      uuid
    }
    hasStressCheck
    hasStressCheckText
    joinOn
    jobTitle
    profilePicturePath
    uuid
    workplace {
      customersCount
      name
      uuid
    }
    workingArrangement
  }
}
// Query Variables
{
  "customerInput": {
    "uuid": "1e280cee-1f1a-4e34-be3f-0a3a13558cf7",
    "branchUuid": "3bdd3daf-b6c2-4e50-9cc6-015f51a488ad" ,
    "groupAnalysisUuid": "449b2ed1-8984-4e19-bcac-49309b11d2bc",
    "departmentName": "新規部署"
  }
} 
// query実行結果
{
  "data": {
    "upsertCustomer": {
      "age": "20",
      "bio": "自己紹介",
      "bornOn": "2000-01-01",
      "branch": {
        "displayName": "東京支社",
        "uuid": "3bdd3daf-b6c2-4e50-9cc6-015f51a488ad"
      },
      "department": {
        "customersCount": 1,
        "displayName": "新規部署",
        "uuid": "b997dacf-e62c-46e0-8060-90b9a4651021"
      },
      "email": "dummy.mail@example.com",
      "errors": null,
      "employeeNumber": "dummy0001",
      "employmentStatus": "normal",
      "employmentStatusText": "通常勤務",
      "fullname": "山田 太郎",
      "fullnameJa": "やまだ たろう",
      "gender": "male",
      "genderText": "男",
      "groupAnalysis": {
        "displayName": "集団分析1",
        "uuid": "449b2ed1-8984-4e19-bcac-49309b11d2bc"
      },
      "hasStressCheck": "active",
      "hasStressCheckText": "有効",
      "joinOn": "2020-01-01",
      "jobTitle": "エンジニア",
      "profilePicturePath": null,
      "uuid": "1e280cee-1f1a-4e34-be3f-0a3a13558cf7",
      "workplace": null,
      "workingArrangement": "正社員"
    }
  }
}

プロフィール写真の登録について

プロフィール写真の登録にはApolloUploadServerというgemを使用しています。

Clientからアップロードする場合は apollo-upload-client library >= v7.0.0-alpha.3 を使用する必要があります。

Overtimes Query の例

残業時間情報の取得

graphQLのqueryのサンプルを右側のgraphQLのタブに記載しています。

query Overtimes{
  overtimes{
    pageInfo {
      startCursor
      endCursor
      hasNextPage
      hasPreviousPage
    }
    edges{
      cursor
      node{
        customer{
          branch{
            displayName
            uuid
          }
          email
          employeeNumber
          fullname
          uuid
        }
        errors
        hour
        minute
        uuid        
        yearMonth
      }
    }
  }
}
// query実行結果
{
  "data": {
    "overtimes": {
      "pageInfo": {
        "startCursor": "MQ",
        "endCursor": "NjY",
        "hasNextPage": false,
        "hasPreviousPage": false
      },
      "edges": [
        {
          "cursor": "MQ",
          "node": {
            "customer": {
              "branch": {
                "displayName": "東京支社",
                "uuid": "3bdd3daf-b6c2-4e50-9cc6-015f51a488ad"
              },
              "email": "demo-account+101@example.com",
              "employeeNumber": "101",
              "fullname": "従業員 太郎",
              "uuid": "c6775de9-b38e-412d-831c-1f0be0d94874"
            },
            "errors": null,
            "hour": 30,
            "minute": 1800,
            "uuid": "0f9dde49-37b9-4af0-8bbb-2d6e46498f0a",
            "yearMonth": "2019-03-01"
          }
        },
        {
          "cursor": "Mg",
          "node": {
            "customer": {
              "branch": {
                "displayName": "東京支社",
                "uuid": "3bdd3daf-b6c2-4e50-9cc6-015f51a488ad"
              },
              "email": "demo-account+501@example.com",
              "employeeNumber": "501",
              "fullname": "人事 実施事務 太郎",
              "uuid": "191c1fb7-b8b5-4018-b49b-a91c95232965"
            },
            "errors": null,
            "hour": 20,
            "minute": 1200,
            "uuid": "d35183e2-b03b-4e93-8cda-324fcab05c6c",
            "yearMonth": "2019-03-01"
          }
        }
      ]
    }
  }
}

Overtimes Query でCustomerのUUIDで検索した場合の例

graphQLのqueryのサンプルを右側のgraphQLのタブに記載しています。
・登録グループ名での検索(完全一致検索、複数検索可能)
・登録グループUUIDでの検索(完全一致検索、複数検索可能)
・CustomerのUUIDでの検索(完全一致検索、複数検索可能)
・社員番号での検索(完全一致検索、複数検索可能)
の4つの検索が可能です。

query Overtimes{
  overtimes{
    pageInfo {
      startCursor
      endCursor
      hasNextPage
      hasPreviousPage
    }
    edges{
      cursor
      node{
        customer{
          branch{
            displayName
            uuid
          }
          email
          employeeNumber
          fullname
          uuid
        }
        errors
        hour
        minute
        uuid        
        yearMonth
      }
    }
  }
}
// query実行結果
{
  "data": {
    "overtimes": {
      "pageInfo": {
        "startCursor": "MQ",
        "endCursor": "NjY",
        "hasNextPage": false,
        "hasPreviousPage": false
      },
      "edges": [
        {
          "cursor": "Mg",
          "node": {
            "customer": {
              "branch": {
                "displayName": "東京支社",
                "uuid": "3bdd3daf-b6c2-4e50-9cc6-015f51a488ad"
              },
              "email": "demo-account+501@example.com",
              "employeeNumber": "501",
              "fullname": "人事 実施事務 太郎",
              "uuid": "191c1fb7-b8b5-4018-b49b-a91c95232965"
            },
            "errors": null,
            "hour": 20,
            "minute": 1200,
            "uuid": "d35183e2-b03b-4e93-8cda-324fcab05c6c",
            "yearMonth": "2019-03-01"
          }
        }
      ]
    }
  }
}

Overtime Mutation について

overtime mutation実行時の項目、注意点を記載します。

input field 項目名 必須 注意点
yearMonth 残業時間の月日 必須 yyyy-mm-dd or
yyyymmdd 形式で指定・1日で指定してください
customerUuid CustomerのUUID 必須
minute 残業時間(分) 必須

新規登録時のOvertime Mutation の例

graphQLのmutationのサンプルを右側のgraphQLのタブに記載しています。
既に該当のyearMonthに残業時間が登録されている場合は更新、なければ新規で登録をします。

mutation upsertOvertime($overtimeInput:ApiOvertimeInput!){
  upsertOvertime(overtimeInput:$overtimeInput){
    customer{
      branch{
        displayName
        uuid
      }
      email
      employeeNumber
      fullname
      uuid
    }
    errors
    hour
    minute
    uuid        
    yearMonth
  }
}
// Query Variables
{
  "overtimeInput": {
      "customerUuid": "c6775de9-b38e-412d-831c-1f0be0d94874",
      "yearMonth": "2019-12-01",
      "minute": 60
  }
}
// query実行結果
{
  "data": {
    "upsertOvertime": {
      "customer": {
        "branch": {
          "displayName": "東京支社",
          "uuid": "3bdd3daf-b6c2-4e50-9cc6-015f51a488ad"
        },
        "email": "demo-account+101@example.com",
        "employeeNumber": "101",
        "fullname": "従業員 太郎",
        "uuid": "c6775de9-b38e-412d-831c-1f0be0d94874"
      },
      "errors": null,
      "hour": 1,
      "minute": 60,
      "uuid": "d35183e2-b03b-4e93-8cda-324fcab05c6c",
      "yearMonth": "2019-12-01"
    }
  }
}

Errorについて

APIの結果がエラーの場合は実行結果へエラー情報が入ってくるので内容を確認して下さい。

エラーが返ってくるパターンとして下記の2パターンあります。
{ "data": { "upsertCustomer": { "errors": "{}" } } }
{ "errors": [] }

エラーのサンプルを右側のgraphQLのタブに記載しています。

// query実行結果
// emailが未入力の場合エラーとなる例です。
{
  "data": {
    "upsertCustomer": {
      "errors": "{\"errors\":{\"email\":[\"を入力してください\"]},\"full_messages\":[\"メールアドレスを入力してください\"],\"details\":{\"email\":[{\"error\":\"blank\"}]}}",
    }
  }
}
// genderはGenderFieldへ定義された値のみを受け付けます。
// GenderFieldへ存在しない値を指定した場合や未入力の場合はエラーとなります。
{
  "errors": [
    {
      "message": "Variable $customerInput of type CustomerInput! was provided invalid value for gender (Expected \"\" to be one of: male, female)",
      "locations": [
        {
          "line": 1,
          "column": 25
        }
      ],
      "extensions": {
        "value": {
          "uuid": "1e280cee-1f1a-4e34-be3f-0a3a13558cf7",
          "gender": ""
        },
        "problems": [
          {
            "path": [
              "gender"
            ],
            "explanation": "Expected \"\" to be one of: male, female"
          }
        ]
      }
    }
  ]
}

Rate limit

APIへのリクエスト数の上限について

IPアドレス毎に1秒間に20リクエスト処理されます。

それを超えた場合はステータスコード429のレスポンスが返されます。

# リクエスト数が上限に達した場合のレスポンス
429 Too Many Requests