freee の API 経由で、取引データの登録を行うコードは時折見かけますが、領収書の登録を行うコードはあまり見かけない。
そこで、領収書(画像データ)を会計freeeに登録するサンプルコードを書いてみました。
環境
Mac OS
Node.js v10.19.0
リクエストの書式を確認
freee の開発者向けサイト 「Developers Community」 からAPIへのリクエストの書式を確認する
- 登録したfreee アプリを使ってアクセストークンを取得
- Developers Community にトークンを読み込ませる
- APIリファレンスからテストコール
登録テストに使う事業所の company_id を確認するエンドポイントは 「companies」
領収書の登録用エンドポイントは「receipts」。
領収書を登録するCURLは以下の通り
curl -X POST "https://api.freee.co.jp/api/1/receipts" -H "accept: application/json" -H "Authorization: Bearer アクセストークンの文字列" -H "Content-Type: multipart/form-data" -F "company_id=事業所のID" -F "description=" -F "issue_date=" -F "receipt=@画像ファイル名;type=image/jpeg"
事前準備
Desktopに作業用のディレクトリを作成
mkdir imagepost
cd imagepost
npm init してパッケージをインストールする。今回使うのは
- fs
- form-data
- axios
npm init
npm install fs --save
npm install form-data --save
npm install axios --save
実際のコード
const fs = require('fs');
const FormData = require('form-data');
const axios = require('axios');
const auth_token ='freee API のアクセストークン';
const company_id = '事業所ID';
const url = `https://api.freee.co.jp/api/1/receipts`; //領収書を登録するエンドポイント
const imagePath = `./images/receipt_1.jpg`; //画像のパス
const file = fs.createReadStream(imagePath);
const form = new FormData();
form.append('receipt', file);
form.append('company_id', company_id);
const config = {
headers: {
'accept' : 'application/json',
'Authorization' : 'Bearer ' + auth_token,
'Content-Type' : 'multipart/form-data',
...form.getHeaders(),
}
}
axios.post(url, form, config)
.then(res => console.log(res.data))
.catch(err => console.log(err));
実行すると、無事に領収書が登録されました。

ポイントとしては、領収書の画像を FormDataに追加する時に、要素名を「reciept」と指定するところあたりでしょうか。
参考情報
https://qiita.com/n0bisuke/items/1d1cfc330997f93e2ee8
https://qiita.com/kazu_death/items/a94ac4ae4d71928920c5
https://github.com/axios/axios#form-data
のびすけさんも書いていましたが、ブラウザから画像を multipart/form-data でポストする例は多いけれど、サーバー側からポストする例は少ない。
上記の記事は大変参考になりました。