🎱

Misoca API v3を使って、請求書を複製してみたいと思った

に公開

こんにちは☀️
TRUSTART株式会社のみつです!

Misocaは、無料プランである程度の機能が利用できる請求書サービス。

個人で活動されてる方たちにとっては、制限ありでもこの機能で無料はアツい?と勝手に思ってたり。

請求書の複製をターミナルからコマンドでできないかなぁとふと思い、Misoca API v3でどんなことができるのかなを覗いてみました!

Misoca APIって便利なのでは・・・?

普段、見積書や請求書をパパッと作りたい時に利用しています!

これまでのわたし

同じ会社様宛に毎月発行する請求書があります。

  1. ログインをする ← ID, PASS入力とか地味に大変ですよね・・(怠惰)
  2. 画面から複製
  3. 複製した請求書の変更する部分を変更

がこれまでのわたし。

「頑張って画面から作りましょう」→「はい。」

ではなく・・・

「頑張って画面から作りましょう」→「APIで複製とかすればコマンド一撃で複製できる?」

を実現したい記事です。

Misoca API v3の使い方

めちゃくちゃ丁寧にやり方が書いてあり、それ通りに作れば何やらできそうな雰囲気!

書いてある通り、やってみます。

Misoca API v3についてはこちら

STEP1:URLへアクセス

Misoca にログインした状態で、 https://app.misoca.jp/oauth2/applications にアクセスします。

STEP2:アプリ作成

新しいアプリケーション ボタンを押下します。これにより「アプリケーションの作成」画面に遷移します。

次の各項目記入してください。
名称
アプリケーションの名称です。任意の名称をつけることが出来ます。利用権限の確認時に表示されます。

コールバックURL
OAuth2 利用時のコールバックURLです。ここに挙げられたURL以外へはコールバックできません。改行区切りにて複数行記入することが出来ます。

とりあえず、下記を登録してみます。

  • 名称
    • 何かしらができるアプリ
  • コールバックURL
    • http://localhost:3000/callback

STEP3:画面に出てくる値を眺める

後でアプリ消すし、赤で塗らなくてもいいなぁとか思いながら一応赤塗り。

STEP4:承認チャレンジ → 失敗w

・・・笑

それはそうなんだけど・・・

localhostで何もしてないから、サーバーに接続できませんエラー!笑

STEP5:localhostでなんとなく準備

もはやSTEPに含めるか悩んだ&流れから外れてますけど、一旦ね、一旦。

いい感じのファイルを準備する。

コードたち
  1. mkdir test & cd test
  2. npm init -y
  3. npm install express axios
  4. touch serve.js
  5. 下記のコードを書いておく(ChatGPTで生成しました)
serve.js
const express = require('express');
const axios = require('axios');
const app = express();

const CLIENT_ID = 'アプリケーションID';
const CLIENT_SECRET = 'シークレット';
const REDIRECT_URI = 'コールバックURL';

app.get('/callback', async (req, res) => {
  const code = req.query.code;

  try {
    const tokenRes = await axios.post(
      'https://app.misoca.jp/oauth2/token',
      new URLSearchParams({
        grant_type: 'authorization_code',
        code: code,
        redirect_uri: REDIRECT_URI,
      }),
      {
        auth: {
          username: CLIENT_ID,
          password: CLIENT_SECRET,
        },
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
        },
      }
    );

    res.send(`
      <h1>アクセストークン取得成功!</h1>
      <pre>${JSON.stringify(tokenRes.data, null, 2)}</pre>
    `);
  } catch (error) {
    console.error('Token error:', error.response?.data || error.message);
    res.send(`<h1>エラー発生</h1><pre>${JSON.stringify(error.response?.data || error.message, null, 2)}</pre>`);
  }
});

app.listen(3000, () => {
  console.log('サーバー起動中: http://localhost:3000');
});

STEP6:再承認チャレンジ → 成功!

Yes!取得成功!

{
  "access_token": "実行に使うトークン",
  "token_type": "Bearer",
  "expires_in": 86400,
  "refresh_token": "更新のためのトークン",
  "scope": "write",
  "created_at": 1747539783
}

STEP7:次は、何かをコンソールで得たい

せっかくトークンをもらえました。

次は、何かを得たいです!!

curlを使って、jqも使い、綺麗にしちゃって取得します。

レスポンスは、隠す場所多すぎ...笑

一旦、赤背景ボン!

curl -X GET "https://app.misoca.jp/api/v3/invoices" \
  -H "Authorization: Bearer 実行に使うトークン" \
  -H "Accept: application/json" | jq

STEP8:次は、リフレッシュトークンでトークン更新したい

ここも、jq使って綺麗にしちゃうもんね

リフレッシュトークンもうまいことできてそうな感じです。

curl -X POST "https://app.misoca.jp/oauth2/token" \
  -u "アプリケーションID:シークレット" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=refresh_token" \
  -d "refresh_token=更新のためのトークン" | jq

いい感じすぎ。

STEP9:あとはAPIドキュメントを読んでみる

トークンもゲットできて、リフレッシュトークンも使えるようになりました。

ここからは、Misoca API v3のドキュメントを見て、どんな使い方できるかなぁの時間。

Misoca API v3ドキュメントのリンクはこちら

色々充実してた

取引先一覧を取得請求書・見積もり書の一覧を取得請求書を入金済へ変更とか色々できそう。

ざっと出したいなぁとか、ツンとステータス変えたいなぁ系が充実しててはっぴーな気持ちになりました。

既存の請求書の複製

すでにある請求書を複製をしたいみたいな場合は、APIとして提供はされてなさそげな感じもしつつ、組み合わせでできるからあえてないんだろうかとも思いつつ。

既存の請求書を取得、必要項目変えてPOSTすれば良さそうでした(APIあったらめっちゃごめんなさい)

curl -s -H "Authorization: Bearer 実行に使うトークン" https://app.misoca.jp/api/v3/invoice/{請求書のID} \
  | jq '{
      subject: (.subject + "(複製)"),
      contact_id,
      issue_date: "2025-05-18",
      payment_due_on: "2025-06-01",
      body,
      items
    }' \
  | curl -X POST https://app.misoca.jp/api/v3/invoice \
      -H "Authorization: Bearer 実行に使うトークン" \
      -H "Content-Type: application/json" \
      --data @-

バッチリすぎ。

まとめ

Misoca API v3で提供されている機能のおかげでターミナルから出ない生活が捗りそうです。

今回はlocalhostでコールバック設定をしたので、そこだけちゃんとすれば、あとはノリと勢いで使っていきたいです。

おわり。

参考リンク

Misoca関連

https://doc.misoca.jp

https://doc.misoca.jp/v3/

https://doc.misoca.jp/v3/document.html#/dealing_item

jqコマンド

https://jqlang.org

最後に

TRUSTART株式会社は、一緒に働くメンバーを募集しています!
インターンメンバーも大募集中です!
興味を持っていただいた方は、ぜひ弊社のページをご確認ください!!!

https://www.trustart.co.jp/recruit/

TRUSTARTテックブログ

Discussion