patentgrepDocs

PatentsView-compatible

Assignees, inventors and locations

One record per assignee, inventor, attorney and location, with their activity over time. IDs come from our own matching, so they don't equal PatentsView's.

Send q, f, s and o as one JSON body with POST, or as JSON-encoded query parameters with GET.

56 of 57 PatentsView fields are served; inventor_gender_code is not, because PatentsView infers gender from first names. Entity IDs such as inventor_id are our own. All differences

Try itDemo key
POST /api/v1/assignee/
Response200Recorded 11 Oct 2026
{
  "error": false,
  "count": 3,
  "total_hits": 39,
  "assignees": [
    {
      "assignee_id": "ed0787150cf417a4cf9d55b19a337323",
      "assignee_organization": "Tesla, Inc.",
      "assignee_num_patents": 607
    },
    {
      "assignee_id": "d5969b7ef51e6471da22473bb5230778",
      "assignee_organization": "Tesla Motors, Inc.",
      "assignee_num_patents": 286
    },
    {
      "assignee_id": "af32f6b80c1ff69a645a101807b00d79",
      "assignee_organization": "Tesla Nanocoatings, Inc.",
      "assignee_num_patents": 21
    }
  ]
}

Request body

qobjectRequired

The query. A field and value matches exactly; combine clauses with _and, _or and _not. Dates use YYYY-MM-DD.

farray of stringsDefault: the endpoint's default fields

Fields to return. Name a group such as assignees to get all of its fields, or one field such as assignees.assignee_organization.

sarray of objects

Sort order, for example [{"patent_date": "desc"}]. Only sortable fields are allowed; end with a unique field to keep paging stable.

oobject
sizeRows per page. Default 100, up to 1,000. 0 returns only the count.afterCursor: the last row's sort values, in sort order.offsetSkip rows. Don't combine with after.

Operators and cursor paging work as on Patents.

curl https://api.patentgrep.com/api/v1/assignee/ \
  -H "X-Api-Key: $PATENTGREP_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "q": {"_text_phrase": {"assignee_organization": "Tesla"}},
    "f": [
      "assignee_id",
      "assignee_organization",
      "assignee_num_patents"
    ],
    "s": [{"assignee_num_patents": "desc"}],
    "o": {"size": 3}
  }'
import os, requests

resp = requests.post(
    "https://api.patentgrep.com/api/v1/assignee/",
    headers={"X-Api-Key": os.environ["PATENTGREP_KEY"]},
    json={
          "q": {"_text_phrase": {"assignee_organization": "Tesla"}},
          "f": [
            "assignee_id",
            "assignee_organization",
            "assignee_num_patents"
          ],
          "s": [{"assignee_num_patents": "desc"}],
          "o": {"size": 3}
        },
)
resp.raise_for_status()
data = resp.json()
print(data)
const res = await fetch("https://api.patentgrep.com/api/v1/assignee/", {
  headers: {
    "X-Api-Key": process.env.PATENTGREP_KEY,
    "Content-Type": "application/json",
  },
  method: "POST",
  body: JSON.stringify({
    "q": {"_text_phrase": {"assignee_organization": "Tesla"}},
    "f": [
      "assignee_id",
      "assignee_organization",
      "assignee_num_patents"
    ],
    "s": [{"assignee_num_patents": "desc"}],
    "o": {"size": 3}
  }),
});
if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
const data = await res.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

func main() {
	body := strings.NewReader(`{
	  "q": {"_text_phrase": {"assignee_organization": "Tesla"}},
	  "f": [
	    "assignee_id",
	    "assignee_organization",
	    "assignee_num_patents"
	  ],
	  "s": [{"assignee_num_patents": "desc"}],
	  "o": {"size": 3}
	}`)

	req, err := http.NewRequest(http.MethodPost, "https://api.patentgrep.com/api/v1/assignee/", body)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-Api-Key", os.Getenv("PATENTGREP_KEY"))
	req.Header.Set("Content-Type", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	data, err := io.ReadAll(res.Body)
	if err != nil {
		panic(err)
	}
	if res.StatusCode != http.StatusOK {
		panic(fmt.Sprintf("%s: %s", res.Status, data))
	}
	fmt.Println(string(data))
}
require "json"
require "net/http"

uri = URI("https://api.patentgrep.com/api/v1/assignee/")

req = Net::HTTP::Post.new(uri)
req["X-Api-Key"] = ENV.fetch("PATENTGREP_KEY")
req["Content-Type"] = "application/json"
req.body = <<~'JSON'
  {
    "q": {"_text_phrase": {"assignee_organization": "Tesla"}},
    "f": [
      "assignee_id",
      "assignee_organization",
      "assignee_num_patents"
    ],
    "s": [{"assignee_num_patents": "desc"}],
    "o": {"size": 3}
  }
JSON

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
raise "#{res.code}: #{res.body}" unless res.is_a?(Net::HTTPSuccess)
data = JSON.parse(res.body)
p data

/api/v1/assignee/

POST/api/v1/assignee/

Rows come back in assignees. Without f you get assignee_id, assignee_organization, assignee_individual_name_first. One record by id: GET /api/v1/assignee/{assignee_id}/.

18 fields
FieldTypeSortDescription
assignee_idstringYesUnique identifier for the assignee.
assignee_organizationstringNoName of the organization, if the assignee is an organization.
assignee_individual_name_firststringNoFirst name of the assignee, if an individual.
assignee_individual_name_laststringNoLast name of the assignee, if an individual.
assignee_typestringNoType of assignee (e.g., individual, corporate).
assignee_lastknown_citystringNoCity where the assignee was last known to reside or be located.
assignee_lastknown_statestringNoState where the assignee was last known to reside or be located.
assignee_lastknown_countrystringNoCountry where the assignee was last known to reside or be located.
assignee_lastknown_latitudenumberYesLatitude of the last known location of the assignee.
assignee_lastknown_longitudenumberYesLongitude of the last known location of the assignee.
assignee_lastknown_locationstringNoLocation identifier for the last known location of the assignee.
assignee_first_seen_datedateYesDate when the assignee was first recorded.
curl https://api.patentgrep.com/api/v1/assignee/ \
  -H "X-Api-Key: $PATENTGREP_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "q": {"assignee_id": "example-id"},
    "f": [
      "assignee_id",
      "assignee_organization",
      "assignee_individual_name_first"
    ],
    "s": [{"assignee_id": "asc"}],
    "o": {"size": 25}
  }'
import os, requests

resp = requests.post(
    "https://api.patentgrep.com/api/v1/assignee/",
    headers={"X-Api-Key": os.environ["PATENTGREP_KEY"]},
    json={
          "q": {"assignee_id": "example-id"},
          "f": [
            "assignee_id",
            "assignee_organization",
            "assignee_individual_name_first"
          ],
          "s": [{"assignee_id": "asc"}],
          "o": {"size": 25}
        },
)
resp.raise_for_status()
data = resp.json()
print(data)
const res = await fetch("https://api.patentgrep.com/api/v1/assignee/", {
  headers: {
    "X-Api-Key": process.env.PATENTGREP_KEY,
    "Content-Type": "application/json",
  },
  method: "POST",
  body: JSON.stringify({
    "q": {"assignee_id": "example-id"},
    "f": [
      "assignee_id",
      "assignee_organization",
      "assignee_individual_name_first"
    ],
    "s": [{"assignee_id": "asc"}],
    "o": {"size": 25}
  }),
});
if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
const data = await res.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

func main() {
	body := strings.NewReader(`{
	  "q": {"assignee_id": "example-id"},
	  "f": [
	    "assignee_id",
	    "assignee_organization",
	    "assignee_individual_name_first"
	  ],
	  "s": [{"assignee_id": "asc"}],
	  "o": {"size": 25}
	}`)

	req, err := http.NewRequest(http.MethodPost, "https://api.patentgrep.com/api/v1/assignee/", body)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-Api-Key", os.Getenv("PATENTGREP_KEY"))
	req.Header.Set("Content-Type", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	data, err := io.ReadAll(res.Body)
	if err != nil {
		panic(err)
	}
	if res.StatusCode != http.StatusOK {
		panic(fmt.Sprintf("%s: %s", res.Status, data))
	}
	fmt.Println(string(data))
}
require "json"
require "net/http"

uri = URI("https://api.patentgrep.com/api/v1/assignee/")

req = Net::HTTP::Post.new(uri)
req["X-Api-Key"] = ENV.fetch("PATENTGREP_KEY")
req["Content-Type"] = "application/json"
req.body = <<~'JSON'
  {
    "q": {"assignee_id": "example-id"},
    "f": [
      "assignee_id",
      "assignee_organization",
      "assignee_individual_name_first"
    ],
    "s": [{"assignee_id": "asc"}],
    "o": {"size": 25}
  }
JSON

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
raise "#{res.code}: #{res.body}" unless res.is_a?(Net::HTTPSuccess)
data = JSON.parse(res.body)
p data

/api/v1/inventor/

POST/api/v1/inventor/

Rows come back in inventors. Without f you get inventor_id, inventor_name_first, inventor_name_last. One record by id: GET /api/v1/inventor/{inventor_id}/.

17 fields
FieldTypeSortDescription
inventor_idstringYesUnique identifier for the inventor.
inventor_name_firststringNoFirst name of the inventor.
inventor_name_laststringNoLast name of the inventor.
inventor_lastknown_citystringNoCity where the inventor was last known to reside or be located.
inventor_lastknown_statestringNoState where the inventor was last known to reside or be located.
inventor_lastknown_countrystringNoCountry where the inventor was last known to reside or be located.
inventor_lastknown_latitudenumberYesLatitude of the last known location of the inventor.
inventor_lastknown_longitudenumberYesLongitude of the last known location of the inventor.
inventor_lastknown_locationstringNoLocation identifier for the last known location of the inventor.
inventor_first_seen_datedateYesDate when the inventor was first recorded.
inventor_last_seen_datedateYesDate when the inventor was last recorded.
inventor_years_activeintegerYesNumber of years the inventor has been active.
curl https://api.patentgrep.com/api/v1/inventor/ \
  -H "X-Api-Key: $PATENTGREP_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "q": {"inventor_id": "example-id"},
    "f": [
      "inventor_id",
      "inventor_name_first",
      "inventor_name_last"
    ],
    "s": [{"inventor_id": "asc"}],
    "o": {"size": 25}
  }'
import os, requests

resp = requests.post(
    "https://api.patentgrep.com/api/v1/inventor/",
    headers={"X-Api-Key": os.environ["PATENTGREP_KEY"]},
    json={
          "q": {"inventor_id": "example-id"},
          "f": [
            "inventor_id",
            "inventor_name_first",
            "inventor_name_last"
          ],
          "s": [{"inventor_id": "asc"}],
          "o": {"size": 25}
        },
)
resp.raise_for_status()
data = resp.json()
print(data)
const res = await fetch("https://api.patentgrep.com/api/v1/inventor/", {
  headers: {
    "X-Api-Key": process.env.PATENTGREP_KEY,
    "Content-Type": "application/json",
  },
  method: "POST",
  body: JSON.stringify({
    "q": {"inventor_id": "example-id"},
    "f": [
      "inventor_id",
      "inventor_name_first",
      "inventor_name_last"
    ],
    "s": [{"inventor_id": "asc"}],
    "o": {"size": 25}
  }),
});
if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
const data = await res.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

func main() {
	body := strings.NewReader(`{
	  "q": {"inventor_id": "example-id"},
	  "f": [
	    "inventor_id",
	    "inventor_name_first",
	    "inventor_name_last"
	  ],
	  "s": [{"inventor_id": "asc"}],
	  "o": {"size": 25}
	}`)

	req, err := http.NewRequest(http.MethodPost, "https://api.patentgrep.com/api/v1/inventor/", body)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-Api-Key", os.Getenv("PATENTGREP_KEY"))
	req.Header.Set("Content-Type", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	data, err := io.ReadAll(res.Body)
	if err != nil {
		panic(err)
	}
	if res.StatusCode != http.StatusOK {
		panic(fmt.Sprintf("%s: %s", res.Status, data))
	}
	fmt.Println(string(data))
}
require "json"
require "net/http"

uri = URI("https://api.patentgrep.com/api/v1/inventor/")

req = Net::HTTP::Post.new(uri)
req["X-Api-Key"] = ENV.fetch("PATENTGREP_KEY")
req["Content-Type"] = "application/json"
req.body = <<~'JSON'
  {
    "q": {"inventor_id": "example-id"},
    "f": [
      "inventor_id",
      "inventor_name_first",
      "inventor_name_last"
    ],
    "s": [{"inventor_id": "asc"}],
    "o": {"size": 25}
  }
JSON

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
raise "#{res.code}: #{res.body}" unless res.is_a?(Net::HTTPSuccess)
data = JSON.parse(res.body)
p data

/api/v1/patent/attorney/

POST/api/v1/patent/attorney/

Rows come back in attorneys. Without f you get attorney_id, attorney_name_first, attorney_name_last. One record by id: GET /api/v1/patent/attorney/{attorney_id}/.

9 fields
FieldTypeSortDescription
attorney_idstringYesUnique identifier for the attorney.
attorney_name_firststringNoFirst name of the attorney.
attorney_name_laststringNoLast name of the attorney.
attorney_organizationstringNoName of the organization the attorney is associated with.
attorney_first_seen_datedateYesDate when the attorney was first recorded.
attorney_last_seen_datedateYesDate when the attorney was last recorded.
attorney_years_activeintegerYesNumber of years the attorney has been active.
attorney_num_patentsintegerYesNumber of patents associated with the attorney.
attorney_num_inventorsintegerYesNumber of inventors associated with the attorney.
curl https://api.patentgrep.com/api/v1/patent/attorney/ \
  -H "X-Api-Key: $PATENTGREP_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "q": {"attorney_id": "example-id"},
    "f": [
      "attorney_id",
      "attorney_name_first",
      "attorney_name_last"
    ],
    "s": [{"attorney_id": "asc"}],
    "o": {"size": 25}
  }'
import os, requests

resp = requests.post(
    "https://api.patentgrep.com/api/v1/patent/attorney/",
    headers={"X-Api-Key": os.environ["PATENTGREP_KEY"]},
    json={
          "q": {"attorney_id": "example-id"},
          "f": [
            "attorney_id",
            "attorney_name_first",
            "attorney_name_last"
          ],
          "s": [{"attorney_id": "asc"}],
          "o": {"size": 25}
        },
)
resp.raise_for_status()
data = resp.json()
print(data)
const res = await fetch("https://api.patentgrep.com/api/v1/patent/attorney/", {
  headers: {
    "X-Api-Key": process.env.PATENTGREP_KEY,
    "Content-Type": "application/json",
  },
  method: "POST",
  body: JSON.stringify({
    "q": {"attorney_id": "example-id"},
    "f": [
      "attorney_id",
      "attorney_name_first",
      "attorney_name_last"
    ],
    "s": [{"attorney_id": "asc"}],
    "o": {"size": 25}
  }),
});
if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
const data = await res.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

func main() {
	body := strings.NewReader(`{
	  "q": {"attorney_id": "example-id"},
	  "f": [
	    "attorney_id",
	    "attorney_name_first",
	    "attorney_name_last"
	  ],
	  "s": [{"attorney_id": "asc"}],
	  "o": {"size": 25}
	}`)

	req, err := http.NewRequest(http.MethodPost, "https://api.patentgrep.com/api/v1/patent/attorney/", body)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-Api-Key", os.Getenv("PATENTGREP_KEY"))
	req.Header.Set("Content-Type", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	data, err := io.ReadAll(res.Body)
	if err != nil {
		panic(err)
	}
	if res.StatusCode != http.StatusOK {
		panic(fmt.Sprintf("%s: %s", res.Status, data))
	}
	fmt.Println(string(data))
}
require "json"
require "net/http"

uri = URI("https://api.patentgrep.com/api/v1/patent/attorney/")

req = Net::HTTP::Post.new(uri)
req["X-Api-Key"] = ENV.fetch("PATENTGREP_KEY")
req["Content-Type"] = "application/json"
req.body = <<~'JSON'
  {
    "q": {"attorney_id": "example-id"},
    "f": [
      "attorney_id",
      "attorney_name_first",
      "attorney_name_last"
    ],
    "s": [{"attorney_id": "asc"}],
    "o": {"size": 25}
  }
JSON

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
raise "#{res.code}: #{res.body}" unless res.is_a?(Net::HTTPSuccess)
data = JSON.parse(res.body)
p data

/api/v1/location/

POST/api/v1/location/

Rows come back in locations. Without f you get location_id, location_name, location_state. One record by id: GET /api/v1/location/{location_id}/.

13 fields
FieldTypeSortDescription
location_idstringYesUnique identifier for the location.
location_namestringNoName of the location (city or place).
location_statestringNoState where the location is situated.
location_countrystringNoCountry where the location is situated.
location_countystringNoCounty where the location is situated.
location_county_fipsstringNoFIPS code for the county.
location_state_fipsstringNoFIPS code for the State.
location_place_typestringNoType of the place.
location_latitudenumberYesLatitude of the location.
location_longitudenumberYesLongitude of the location.
location_num_assigneesintegerYesNumber of assignees associated with the location.
location_num_inventorsintegerYesNumber of inventors associated with the location.
curl https://api.patentgrep.com/api/v1/location/ \
  -H "X-Api-Key: $PATENTGREP_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "q": {"location_id": "example-id"},
    "f": ["location_id", "location_name", "location_state"],
    "s": [{"location_id": "asc"}],
    "o": {"size": 25}
  }'
import os, requests

resp = requests.post(
    "https://api.patentgrep.com/api/v1/location/",
    headers={"X-Api-Key": os.environ["PATENTGREP_KEY"]},
    json={
          "q": {"location_id": "example-id"},
          "f": ["location_id", "location_name", "location_state"],
          "s": [{"location_id": "asc"}],
          "o": {"size": 25}
        },
)
resp.raise_for_status()
data = resp.json()
print(data)
const res = await fetch("https://api.patentgrep.com/api/v1/location/", {
  headers: {
    "X-Api-Key": process.env.PATENTGREP_KEY,
    "Content-Type": "application/json",
  },
  method: "POST",
  body: JSON.stringify({
    "q": {"location_id": "example-id"},
    "f": ["location_id", "location_name", "location_state"],
    "s": [{"location_id": "asc"}],
    "o": {"size": 25}
  }),
});
if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
const data = await res.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

func main() {
	body := strings.NewReader(`{
	  "q": {"location_id": "example-id"},
	  "f": ["location_id", "location_name", "location_state"],
	  "s": [{"location_id": "asc"}],
	  "o": {"size": 25}
	}`)

	req, err := http.NewRequest(http.MethodPost, "https://api.patentgrep.com/api/v1/location/", body)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-Api-Key", os.Getenv("PATENTGREP_KEY"))
	req.Header.Set("Content-Type", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	data, err := io.ReadAll(res.Body)
	if err != nil {
		panic(err)
	}
	if res.StatusCode != http.StatusOK {
		panic(fmt.Sprintf("%s: %s", res.Status, data))
	}
	fmt.Println(string(data))
}
require "json"
require "net/http"

uri = URI("https://api.patentgrep.com/api/v1/location/")

req = Net::HTTP::Post.new(uri)
req["X-Api-Key"] = ENV.fetch("PATENTGREP_KEY")
req["Content-Type"] = "application/json"
req.body = <<~'JSON'
  {
    "q": {"location_id": "example-id"},
    "f": ["location_id", "location_name", "location_state"],
    "s": [{"location_id": "asc"}],
    "o": {"size": 25}
  }
JSON

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
raise "#{res.code}: #{res.body}" unless res.is_a?(Net::HTTPSuccess)
data = JSON.parse(res.body)
p data