USPTOのAPIを使ってみる

USPTOのAPIにPythonでアクセスしてみます。
USPTOのAPIページはこちらです。

https://developer.uspto.gov/api-catalog

APIの分類がこんなにも(21種類)あります。
すべてを説明することはできませんので、APIをどのように攻略するかについて説明しましょう。

  • Bulk search and download

  • BDSS

  • Patent Assignment Search

  • USPTO Office Action Weekly Zips API

  • USPTO Enriched Citation API v2

  • USPTO Enriched Citation API

  • USPTO Office Action Text Retrieval API

  • USPTO Office Action Rejection API

  • USPTO Office Action Rejection API (beta)

  • USPTO Office Action Citations API

  • USPTO Office Action Citations API (beta)

  • IP Marketplace Platform API

  • PTAB API v2

  • OCE - Patent Examination Status Codes

  • OCE - Patent Examination Event Codes

  • OCE - Patent Litigation Cases

  • Patent Examination Data System

  • Cancer Moonshot Patent Data Set API

  • PatentsView

  • Trademark Assignment Search Data

  • TSDR Data API


API仕様書でトライアル

それでは、Bulk search and download を例にプログラムなしでアクセスしてみましょう。
先ほどの API Catalog のページを開くと Bulk search and download の項目があります。

Bulk search and download

リンクをクリックすると、詳細な説明のページに遷移します。一度に最大100の出願番号を zip ファイルでダウンロードできることが書かれています。
このページに API Syntax のリンクがあります。このリンクを(ctrlキーを押しながら)クリックします。
そうすると Swagger の Bulkdata Search and Package API というページが開きます。
このページが API 仕様書であり、USPTO の場合は実際にデータを入力して送受信できます(JPOの場合は送受信できない)。
それでは、この中から /v1/application/publications をクリックしてください。publications search です。

publications search

ここで、Try it out をクリックしてみてください。すると検索項目に入力できるようになります。
いろいろな検索項目が入力できることがわかりますが、ここでは一番下の largeTextSearchFlag に "polyester and film" と入力して、Execute ボタンを押してみます。

largeTextSearchFlag に入力

するとなにやら処理しているようで、結構待たされますが、しばらくするとレスポンスが返ってきます。
Response body が表示されている窓の右下にこんなボタンがあるのが見えるでしょうか。

ブラウザ表示とダウンロードのボタン

左のボタンは Response body として返ってくる json をブラウザで表示する機能、右のボタンは json をファイルとしてダウンロードする機能です。
どちらでもいいので、json を表示させてください。

response.text

ここでは、patentApplicationNumber でサーチをかけましたが、100件ヒットしています。
101~200件目のデータを取得するには、start に 101 を入力します。

この response.text を "polyester and film" で検索してもヒットしませんが、"polyester" と "film" とで検索すると、前者は21件、後者は714件ヒットします。これは、"polyester" と "and" と "film" をそれぞれ検索して、その OR 集合を返していることを意味します。

それでは、なんとか「polyester film」で検索できないかと、 "polyester film"、'polyester film'、polyester & film で検索してみましたが 、結果は一緒でした。
どなたか、AND検索の方法を探していただけないでしょうか。見つかったら、 info@sasiapi.org までお知らせください。

Python のコードに移植

それでは、/v1/application/publications を Python でリクエストするコードを書いていきます。

import requests
import urllib.parse
import json

query = [
    ['searchText', ''],
    ['criteriaSearchText', ''],
    ['inventionSubjectMatterCategory', ''],
    ['publicationFromDate', ''], 
    ['publicationToDate', ''], 
    ['publicationDocumentIdentifier', ''], 
    ['patentApplicationNumber', ''], 
    ['filingDateFromDate', ''], 
    ['filingDateToDate', ''], 
    ['inventionTitle', ''], 
    ['assigneeEntityName', ''], 
    ['inventorNameText', ''], 
    ['claimText', ''], 
    ['abstractText', ''], 
    ['descriptionText', ''], 
    ['start', '3'], 
    ['rows', ''], 
    ['sortField', ''], 
    ['sortOrder', ''], 
    ['largeTextSearchFlag', 'polyester film']
]

addtext = ''.join(['&'+l[0]+'='+urllib.parse.quote(l[1]) for l in query if l[1]!=''])
url = 'https://developer.uspto.gov/ibd-api/v1/application/publications?'+addtext[1:]

response = requests.get(url, verify=False)

ここまでが送信部分です。配列 query は入力する項目とその値で構成されます。
テキスト変数 addtext の作り方は、query の各項目で値が存在するとき、&項目=値という文字列を生成して足し合わせるようにしていますが、「polyester film」のような空白などの記号を url に変換するために、urllib.parse.quote() を通しています。
こうしてできた addtext ですが、文字列の先頭は & で始まるので、2文字目から url に加えます。
基幹となる url はAPI仕様書から作成します。

API仕様書から基幹urlを生成

url ができたらリクエストを送りますが、SSLエラーとなります。ここでは verify=False としてエラーを回避しましたが、本格運用の場合はSSL証明書を発行して、verify='証明書名.pem' と入力したほうがよさそうです。

レスポンスの json 解析

レスポンスは response.text として取り出せますが、これは json 形式なので、 json.load で取り出します。

docs = json.loads(response.text)
data = [[l['patentApplicationNumber'], l['inventionTitle']] for l in docs['results']]

ここでは、'patentApplicationNumber'(出願番号)と'inventionTitle'(発明の名称)の2列を100行含む2次元配列ができます。
USPTO の API では json の階層構造が深くないので、簡単にとり出せるでしょう。json に含まれる項目は、API仕様書で Try it out したときの Response body における白文字で表示されているものです。

Response body 白文字が項目、緑字が値

このあとは pandas でExcel ファイルとして出力するなど、いろいろ料理できます。

おわりに

USPTO の API に python でアクセスする方法を紹介しました。GET メソッドの API は今回の応用で攻略できると思います。POST メソッドの API では 100までの出願番号と e-mail アドレスを送信して zip ファイルを受け取る、というおもしろいものがあります。
USPTO の API では、基本的に API キーが不要ですが、PatentsView と商標TSDR では必要なようです。
このあとは EPO、そしてアジア(の API)を旅します。