restclientを使ってwakatimeのハートビートの送信方法を確認確認した。 認証方法はBasic認証でAPIキーを用いる簡易な方法を用いた。 APIキーの作成は https://wakatime.com/settings/api-key から行える。

:ORIGIN := "https://wakatime.com"
:API_KEY := (base64-encode-string (getenv "WAKATIME_API_KEY"))
:TYPE := "file" ;; app file domain 
:CATEGORY := "learning" ;;
:TIMESTAMP := (float-time)

POST :ORIGIN/api/v1/users/current/heartbeats
Authorization: Basic :API_KEY
Content-Type: application/json

{
  "entity": "foo",
  "project": "symdon",
  "category": ":CATEGORY",
  "language": "org-mode",
  "time": :TIMESTAMP,
  "is_write": true
}
{
  "data": {
    "branch": null,
    "category": "learning",
    "created_at": "2021-07-25T23:43:13Z",
    "cursorpos": null,
    "dependencies": [],
    "entity": "foo",
    "id": "0bff3974-cbf2-4246-84de-14849ad3d357",
    "is_write": true,
    "language": "org-mode",
    "lineno": null,
    "lines": null,
    "machine_name_id": null,
    "project": "symdon",
    "time": 1627256593.444148,
    "type": "file",
    "user_agent_id": null,
    "user_id": "71580bdd-fd95-41a2-babd-182b9a930d8b"
  }
}

// POST https://wakatime.com/api/v1/users/current/heartbeats
// HTTP/1.1 201 CREATED
// Server: nginx
// Date: Sun, 25 Jul 2021 23:43:13 GMT
// Content-Type: application/json
// Content-Length: 393
// Connection: keep-alive
// Access-Control-Allow-Methods: GET, PUT, OPTIONS, PATCH, HEAD, POST
// Access-Control-Max-Age: 21600
// Access-Control-Allow-Origin: *
// X-Content-Type-Options: nosniff
// Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
// X-XSS-Protection: 1; mode=block
// Expect-CT: enforce, max-age=1209600, report-uri='https://3bca3d665311907a9472c2b8373ab3f6.report-uri.com/r/d/ct/enforce'
// Feature-Policy: accelerometer 'none';autoplay 'self';camera 'none';document-domain 'none';fullscreen 'self';geolocation 'none';gyroscope 'none';magnetometer 'none';microphone 'none';midi 'none';payment 'self';picture-in-picture 'none';sync-xhr 'self';usb 'none';
// Referrer-Policy: strict-origin-when-cross-origin
// X-Frame-Options: SAMEORIGIN
// Content-Security-Policy: default-src 'self'; frame-ancestors 'self'; script-src 'self' 'unsafe-eval' https://js.stripe.com https://*.braintreegateway.com https://api.github.com https://www.google.com/ https://www.gstatic.com/ https://www.googletagmanager.com https://www.google-analytics.com https://heapanalytics.com https://*.heapanalytics.com; img-src 'self' data: https://cdn.loom.com/ https://pbs.twimg.com https://checkout.paypal.com https://*.braintreegateway.com heapanalytics.com; style-src 'self' 'unsafe-inline'; media-src 'self' https://*.amazonaws.com; frame-src 'self' https://www.google.com/ https://js.stripe.com/ https://hooks.stripe.com/ https://www.youtube.com/ https://www.loom.com/ player.vimeo.com checkout.paypal.com; object-src 'self'; connect-src 'self' api.github.com https://www.google.com/ www.google-analytics.com heapanalytics.com https://avatar-cdn.atlassian.com https://api.stripe.com;
// Request duration: 0.156332s

各フィールド

FieldTypeMustDescription
entitystringmustエンティティのハートビートは、絶対ファイルパスやドメインなどに対して時間を記録しています
typestringoptionalエンティティのタイプ。ファイル、アプリ、またはドメインにすることができます
categorystringoptionalこのアクティビティのカテゴリ。通常、これは型から自動的に推測されます。コーディング、ビルド、インデックス作成、デバッグ、ブラウジング、テストの実行、テストの作成、手動テスト、ドキュメントの作成、コードレビュー、調査、学習、または設計が可能です。
timefloatmustUNIXエポックタイムスタンプ。小数点以下の数値は秒の端数です>、
projectstringoptionalプロジェクト名
branchstringoptionalブランチ名
languagestringoptionalプログラミング言語など
dependenciesstringoptionalエンティティファイルから検出された依存関係のコンマ区切りリスト
linesintegerwhen entity type is fileエンティティ内の行の総数
linenointegeroptionalカーソルの現在の行行番号
cursorposintegeroptional現在のカーソル列の位置
is_writebooleanoptionalこのハートビートがファイルへの書き込みからトリガーされたかどうか