odp

package module
v1.2.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 1, 2025 License: MIT Imports: 11 Imported by: 0

README

USPTO Open Data Portal (ODP) Go Client

Go Reference

A complete Go client library for the USPTO Open Data Portal API.

Getting Started

API Key Required

You need an API key to use the USPTO ODP API:

Installation

go get github.com/patent-dev/uspto-odp

Quick Start

config := odp.DefaultConfig()
config.APIKey = "your-api-key"
client, err := odp.NewClient(config)
ctx := context.Background()

results, err := client.SearchPatents(ctx, "artificial intelligence", 0, 10)
fmt.Printf("Found %d patents\n", *results.Count)

API Methods - Complete Coverage (38 endpoints)

All 38 USPTO ODP API endpoints are fully implemented and tested.

Patent Application API (13 endpoints)
// Core Patent Data
SearchPatents(ctx, query string, offset, limit int32) (*PatentDataResponse, error)
GetPatent(ctx, patentNumber string) (*PatentDataResponse, error)  // Accepts any patent number format
GetPatentMetaData(ctx, applicationNumber string) (interface{}, error)

// Patent Details
GetPatentAdjustment(ctx, applicationNumber string) (interface{}, error)
GetPatentContinuity(ctx, applicationNumber string) (interface{}, error)
GetPatentDocuments(ctx, applicationNumber string) (*DocumentBag, error)
GetPatentAssignment(ctx, applicationNumber string) (interface{}, error)
GetPatentAssociatedDocuments(ctx, applicationNumber string) (interface{}, error)
GetPatentAttorney(ctx, applicationNumber string) (interface{}, error)
GetPatentForeignPriority(ctx, applicationNumber string) (interface{}, error)
GetPatentTransactions(ctx, applicationNumber string) (interface{}, error)

// Downloads & Utilities
SearchPatentsDownload(ctx, req PatentDownloadRequest) ([]byte, error)
GetStatusCodes(ctx) (*StatusCodeSearchResponse, error)
Bulk Data API (3 endpoints)
SearchBulkProducts(ctx, query string, offset, limit int) (*BdssResponseBag, error)
GetBulkProduct(ctx, productID string) (*BdssResponseProductBag, error)

// File download methods (use FileDownloadURI directly):
DownloadBulkFile(ctx, fileDownloadURI string, w io.Writer) error
DownloadBulkFileWithProgress(ctx, fileDownloadURI string, w io.Writer,
    progress func(bytesComplete, bytesTotal int64)) error
Petition API (3 endpoints)
SearchPetitions(ctx, query string, offset, limit int32) (*PetitionDecisionResponseBag, error)
GetPetitionDecision(ctx, recordID string, includeDocuments bool) (*PetitionDecisionIdentifierResponseBag, error)
SearchPetitionsDownload(ctx, req PetitionDecisionDownloadRequest) ([]byte, error)
PTAB (Patent Trial and Appeal Board) API (19 endpoints)
// Trial Proceedings (IPR, PGR, CBM)
SearchTrialProceedings(ctx, query string, offset, limit int32) (*ProceedingDataResponse, error)
GetTrialProceeding(ctx, trialNumber string) (*ProceedingDataResponse, error)
SearchTrialProceedingsDownload(ctx, req DownloadRequest) ([]byte, error)

// Trial Decisions
SearchTrialDecisions(ctx, query string, offset, limit int32) (*DecisionDataResponse, error)
GetTrialDecision(ctx, documentIdentifier string) (*DecisionDataResponse, error)
GetTrialDecisionsByTrialNumber(ctx, trialNumber string) (*DecisionDataResponse, error)
SearchTrialDecisionsDownload(ctx, req DownloadRequest) ([]byte, error)

// Trial Documents
SearchTrialDocuments(ctx, query string, offset, limit int32) (*DocumentDataResponse, error)
GetTrialDocument(ctx, documentIdentifier string) (*DocumentDataResponse, error)
GetTrialDocumentsByTrialNumber(ctx, trialNumber string) (*DocumentDataResponse, error)
SearchTrialDocumentsDownload(ctx, req DownloadRequest) ([]byte, error)

// Appeal Decisions
SearchAppealDecisions(ctx, query string, offset, limit int32) (*AppealDecisionDataResponse, error)
GetAppealDecision(ctx, documentIdentifier string) (*AppealDecisionDataResponse, error)
GetAppealDecisionsByAppealNumber(ctx, appealNumber string) (*AppealDecisionDataResponse, error)
SearchAppealDecisionsDownload(ctx, req DownloadRequest) ([]byte, error)

// Interference Decisions
SearchInterferenceDecisions(ctx, query string, offset, limit int32) (*InterferenceDecisionDataResponse, error)
GetInterferenceDecision(ctx, documentIdentifier string) (*InterferenceDecisionDataResponse, error)
GetInterferenceDecisionsByNumber(ctx, interferenceNumber string) (*InterferenceDecisionDataResponse, error)
SearchInterferenceDecisionsDownload(ctx, req PatentDownloadRequest) ([]byte, error)

Patent Full Text & Advanced Features

Patent Number Normalization

The library handles various patent number formats and automatically resolves them to application numbers:

// GetPatent accepts any patent number format
doc, err := client.GetPatent(ctx, "US 11,646,472 B2")  // Grant number
doc, err := client.GetPatent(ctx, "17/248,024")        // Application number
doc, err := client.GetPatent(ctx, "US20250087686A1")   // Publication number

// For other methods, resolve to application number first
appNumber, err := client.ResolvePatentNumber(ctx, "US 11,646,472 B2")
// appNumber = "17248024" (the actual application number)

// Low-level normalization (formatting only, doesn't resolve)
pn, err := odp.NormalizePatentNumber("US 11,646,472 B2")
fmt.Println(pn.Type)                  // PatentNumberTypeGrant
fmt.Println(pn.Normalized)            // "11646472" (normalized, not application number!)
fmt.Println(pn.FormatAsGrant())       // "11,646,472"

Note: Grant and publication numbers are not the same as application numbers. The library uses the search API to resolve grant/publication numbers to their corresponding application numbers.

Supported formats:

  • Applications: 17248024, 17/248,024, US 17/248,024
  • Grants: 11646472, 11,646,472, US 11,646,472 B2
  • Publications: 20250087686, US20250087686A1

Note: 8-digit numbers (like 11646472) are ambiguous - they could be either grant or application numbers. Use formatting (commas, kind codes) to disambiguate.

XML Full Text Retrieval

Parse full patent text (ICE DTD 4.6/4.7):

doc, err := client.GetPatentXML(ctx, "US 11,646,472 B2")

title := doc.GetTitle()
abstract := doc.GetAbstract().ExtractAbstractText()
claims := doc.GetClaims().ExtractAllClaimsTextFormatted()
description := doc.GetDescription().ExtractDescriptionText()

Advanced usage:

// Get XML URL and type
xmlURL, docType, err := client.GetXMLURLForApplication(ctx, "17248024")

// Download with type hint
doc, err := client.DownloadXMLWithType(ctx, xmlURL, docType)

// Parse raw XML
data := []byte(/* XML content */)
doc, err = odp.ParseGrantXML(data)  // or ParseApplicationXML

Bulk File Downloads

product, err := client.GetBulkProduct(ctx, "PTGRXML")
files := *product.BulkDataProductBag[0].ProductFileBag.FileDataBag

for _, file := range files {
    if file.FileName != nil && strings.Contains(*file.FileName, "ipg250923.zip") {
        if file.FileDownloadURI != nil {
            err := client.DownloadBulkFileWithProgress(ctx, *file.FileDownloadURI, outputFile,
                func(bytesComplete, bytesTotal int64) {
                    percent := float64(bytesComplete) * 100 / float64(bytesTotal)
                    fmt.Printf("\rProgress: %.1f%%", percent)
                })
        }
        break
    }
}

Configuration

config := &odp.Config{
    BaseURL:    "https://api.uspto.gov", // Default
    APIKey:     "your-api-key",
    UserAgent:  "YourApp/1.0",
    MaxRetries: 3,                       // Retry failed requests
    RetryDelay: 1,                       // Seconds between retries
    Timeout:    30,                      // Request timeout in seconds
}

client, err := odp.NewClient(config)

Package Structure

├── client.go            # Main client implementation (package odp)
├── patent_number.go     # Patent number normalization
├── xml.go               # XML full text parsing (ICE DTD 4.6/4.7)
├── client_test.go       # Unit tests with mock server
├── patent_number_test.go# Patent number normalization tests
├── xml_test.go          # XML parsing tests
├── integration_test.go  # Integration tests (real API)
├── generated/           # Auto-generated OpenAPI code
│   ├── client_gen.go    # Generated client (package generated)
│   └── types_gen.go     # Generated types (package generated)
├── cmd/gen/             # Code generation tool (pure Go)
│   └── main.go          # Bundles swagger files and applies fixes
├── demo/                # Usage examples with saved responses
│   └── main.go          # Demo runner for all API services
├── swagger/             # Official USPTO OpenAPI specs (DO NOT EDIT)
│   ├── swagger.yaml     # Main API specification
│   ├── odp-common-base.yaml  # Shared type definitions
│   └── trial-*.yaml     # PTAB API specifications
├── swagger_fixed.yaml   # Processed spec with fixes (auto-generated)
└── dtd/                 # ICE DTD documentation
    └── README.md        # DTD structure and information

Implementation

This library provides a Go client for the USPTO ODP API through a multi-step process:

  1. API Specification: Started with the official USPTO ODP Swagger specification
  2. Fix Mismatches: Fixed type mismatches between swagger and actual API responses (see Swagger Fixes)
  3. Code Generation: Generate types and client code using oapi-codegen into generated/ package
  4. Idiomatic Wrapper: Wrap generated code in a clean, idiomatic Go client with retry logic (main odp package)

Testing

Unit Tests
go test -v
go test -v -cover
Integration Tests

Requires USPTO_API_KEY environment variable:

# Set your API key (add to ~/.zshrc for persistence)
export USPTO_API_KEY=your-api-key

# Run all integration tests
go test -tags=integration -v

# Run specific endpoint test
go test -tags=integration -v -run TestIntegrationWithRealAPI/GetStatusCodes

# Test endpoint coverage documentation
go test -tags=integration -v -run TestEndpointCoverage

# Test XML parsing with real API data
go test -tags=integration -v -run TestXMLParsing

# Test bulk file download (skipped by default due to large file size)
TEST_BULK_DOWNLOAD=true go test -tags=integration -v -run DownloadBulkFile

Integration tests require USPTO_API_KEY environment variable. Bulk file download test skipped by default (set TEST_BULK_DOWNLOAD=true to run).

Endpoint Coverage

All 38 USPTO ODP API endpoints are implemented and tested:

  • 13 Patent Application API endpoints
  • 3 Bulk Data API endpoints
  • 3 Petition API endpoints
  • 19 PTAB (Patent Trial and Appeal Board) API endpoints

Swagger Processing

Source Files

The USPTO ODP API specification is distributed as multiple YAML files with $ref references between them. The original files are downloaded from USPTO ODP Swagger and stored in swagger/:

swagger/
├── swagger.yaml           # Main API spec (Patent, Bulk, Petition endpoints)
├── odp-common-base.yaml   # Shared type definitions
├── trial-proceedings.yaml # PTAB trial proceedings
├── trial-decisions.yaml   # PTAB trial decisions
├── trial-documents.yaml   # PTAB trial documents
├── trial-appeal-decisions.yaml  # PTAB appeal decisions
├── trial-interferences.yaml     # PTAB interference decisions
└── trial-common.yaml      # Shared PTAB types

Important: Do not edit files in swagger/ - these are the original USPTO specifications.

Code Generation

The cmd/gen tool (pure Go, no external dependencies) processes these files:

go run ./cmd/gen

This tool:

  1. Bundles all YAML files, resolving $ref references between files
  2. Applies fixes for mismatches between swagger spec and actual API responses
  3. Generates swagger_fixed.yaml (processed OpenAPI spec)
  4. Generates Go code in generated/ using oapi-codegen
Fixes Applied

The USPTO swagger specification has several mismatches with actual API responses:

Type Corrections:

  • frameNumber, reelNumber: string → integer (API returns numeric values)
  • documentNumber: string → integer (PTAB API returns numbers)
  • Error response code: integer → string (API returns "404" not 404)

Structure Fixes:

  • petitionIssueConsideredTextBag: array of objects → array of strings
  • correspondenceAddress: array → object (Assignment API returns object)
  • DecisionData.statuteAndRuleBag, issueTypeBag: string → array (PTAB API returns arrays)
  • GetPatentAssignment.assignmentBag: single object → array (API returns array of assignments)

Field Name Fixes:

  • InterferenceDecisionRecord.decisionDocumentDatadocumentData (API uses different field name)

Format Fixes:

  • Removed format: date-time from datetime fields that return non-RFC3339 formats (e.g., lastModifiedDateTime returns "2025-11-26T23:58:00" without timezone)
  • Removed format: date from datetime fields (e.g., appealLastModifiedDateTime returns datetime, not date)
  • Removed format: date from fields returning non-ISO dates (e.g., fileReleaseDate returns "2025-09-23 00:57:53")

Endpoint Fixes:

  • Removed /api/v1/patent/applications/text-to-search (defined in spec but has no operations)

Version History

v1.2.0 - PTAB API Complete (2025-11-27)
  • Support for USPTO ODP 3.0 (released 2025-11-21) which added PTAB datasets
  • Added 19 PTAB (Patent Trial and Appeal Board) API endpoints
  • Trial Proceedings, Decisions, Documents, Appeal Decisions, Interference Decisions
  • Pure Go code generation tool (cmd/gen) with no external dependencies
  • Multi-file swagger processing (USPTO distributes spec as multiple YAML files)
  • Demo with example saving (request/response pairs for documentation)
  • Fixed API/swagger mismatches for PTAB endpoints
v1.1.0 - Patent Number Normalization & XML Parsing
  • Patent number normalization (accepts any format: grant, application, publication)
  • ResolvePatentNumber() to convert grant/publication numbers to application numbers
  • XML full text parsing (ICE DTD 4.6/4.7)
  • Refactored demo suite
v1.0.0 - Initial Release
  • Complete USPTO ODP API client with 19 endpoints
  • Patent Application API (13 endpoints)
  • Bulk Data API (3 endpoints)
  • Petition API (3 endpoints)
  • Retry logic and configurable timeouts

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

MIT License - see LICENSE file for details.

Credits

Developed by:

Acknowledgments

  • USPTO for providing the Open Data Portal API
  • oapi-codegen for code generation

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Int32Ptr

func Int32Ptr(i int32) *int32

Int32Ptr returns a pointer to an int32

func IntPtr

func IntPtr(i int) *int

IntPtr returns a pointer to an int

func StringPtr

func StringPtr(s string) *string

StringPtr returns a pointer to a string

Types

type APIError added in v1.2.1

type APIError struct {
	StatusCode int
	Message    string
}

APIError represents an error returned by the USPTO API with status code

func (*APIError) Error added in v1.2.1

func (e *APIError) Error() string

func (*APIError) IsRetryable added in v1.2.1

func (e *APIError) IsRetryable() bool

IsRetryable returns true for transient errors (429, 5xx) that should be retried

type Abstract added in v1.1.0

type Abstract struct {
	ID         string      `xml:"id,attr"`
	Lang       string      `xml:"lang,attr"`
	Paragraphs []Paragraph `xml:"p"`
}

Abstract represents the patent abstract

func (*Abstract) ExtractAbstractText added in v1.1.0

func (a *Abstract) ExtractAbstractText() string

ExtractAbstractText extracts full text from the abstract

type Bibliography added in v1.1.0

type Bibliography struct {
	PublicationReference *DocumentID `xml:"publication-reference>document-id"`
	ApplicationReference *DocumentID `xml:"application-reference>document-id"`
	InventionTitle       []Text      `xml:"invention-title"`
}

Bibliography contains bibliographic data

type Bold added in v1.1.0

type Bold struct {
	Text string `xml:",chardata"`
}

Bold represents bold text

type Claim added in v1.1.0

type Claim struct {
	ID        string      `xml:"id,attr"`
	Num       string      `xml:"num,attr"`
	ClaimText []ClaimText `xml:"claim-text"`
}

Claim represents a single claim with possibly nested claim-text

func (*Claim) ExtractClaimText added in v1.1.0

func (c *Claim) ExtractClaimText() string

ExtractClaimText recursively extracts full text from a claim

type ClaimText added in v1.1.0

type ClaimText struct {
	ID   string `xml:"id,attr"`
	Text string `xml:",chardata"`
	// Nested claim-text elements for dependent claims
	NestedClaims []ClaimText `xml:"claim-text"`
	// Support for formatting elements
	Sub []Sub    `xml:"sub"`
	Sup []Sup    `xml:"sup"`
	I   []Italic `xml:"i"`
	B   []Bold   `xml:"b"`
}

ClaimText represents claim text with support for nested claim-text elements This recursive structure handles the hierarchical nature of claim dependencies

type Claims added in v1.1.0

type Claims struct {
	ID        string  `xml:"id,attr"`
	Lang      string  `xml:"lang,attr"`
	ClaimList []Claim `xml:"claim"`
}

Claims represents the claims section

func (*Claims) ExtractAllClaimsText added in v1.1.0

func (c *Claims) ExtractAllClaimsText() []string

ExtractAllClaimsText extracts text from all claims

func (*Claims) ExtractAllClaimsTextFormatted added in v1.1.0

func (c *Claims) ExtractAllClaimsTextFormatted() string

ExtractAllClaimsTextFormatted returns formatted claim text with claim numbers

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client is the main USPTO ODP API client

func NewClient

func NewClient(config *Config) (*Client, error)

NewClient creates a new USPTO ODP API client

func (*Client) DownloadBulkFile added in v1.0.0

func (c *Client) DownloadBulkFile(ctx context.Context, fileDownloadURI string, w io.Writer) error

DownloadBulkFile downloads a file directly using the FileDownloadURI from the API response

func (*Client) DownloadBulkFileWithProgress added in v1.0.0

func (c *Client) DownloadBulkFileWithProgress(ctx context.Context, fileDownloadURI string, w io.Writer, progress func(bytesComplete int64, bytesTotal int64)) error

DownloadBulkFileWithProgress downloads a file directly using FileDownloadURI with progress tracking

func (*Client) DownloadXML added in v1.1.0

func (c *Client) DownloadXML(ctx context.Context, url string) (*XMLDocument, error)

DownloadXML downloads and parses an XML document from a given URL If you know the document type, use DownloadXMLWithType for better performance

func (*Client) DownloadXMLWithType added in v1.1.0

func (c *Client) DownloadXMLWithType(ctx context.Context, url string, expectedType DocumentType) (*XMLDocument, error)

DownloadXMLWithType downloads and parses an XML document with a known type hint

func (*Client) GetAppealDecision added in v1.2.0

func (c *Client) GetAppealDecision(ctx context.Context, documentIdentifier string) (*generated.AppealDecisionDataResponse, error)

GetAppealDecision retrieves a specific PTAB appeal decision by document identifier

func (*Client) GetAppealDecisionsByAppealNumber added in v1.2.0

func (c *Client) GetAppealDecisionsByAppealNumber(ctx context.Context, appealNumber string) (*generated.AppealDecisionDataResponse, error)

GetAppealDecisionsByAppealNumber retrieves all decisions for a specific appeal number

func (*Client) GetBulkProduct added in v1.0.0

func (c *Client) GetBulkProduct(ctx context.Context, productID string) (*generated.BdssResponseProductBag, error)

GetBulkProduct retrieves a specific bulk data product

func (*Client) GetInterferenceDecision added in v1.2.0

func (c *Client) GetInterferenceDecision(ctx context.Context, documentIdentifier string) (*generated.InterferenceDecisionDataResponse, error)

GetInterferenceDecision retrieves a specific PTAB interference decision by document identifier

func (*Client) GetInterferenceDecisionsByNumber added in v1.2.0

func (c *Client) GetInterferenceDecisionsByNumber(ctx context.Context, interferenceNumber string) (*generated.InterferenceDecisionDataResponse, error)

GetInterferenceDecisionsByNumber retrieves all decisions for a specific interference number

func (*Client) GetPatent added in v1.0.0

func (c *Client) GetPatent(ctx context.Context, patentNumber string) (*generated.PatentDataResponse, error)

GetPatent retrieves patent data by application, grant, or publication number

func (*Client) GetPatentAdjustment added in v1.0.0

func (c *Client) GetPatentAdjustment(ctx context.Context, applicationNumber string) (any, error)

GetPatentAdjustment retrieves patent term adjustment data

func (*Client) GetPatentAssignment added in v1.0.0

func (c *Client) GetPatentAssignment(ctx context.Context, applicationNumber string) (any, error)

GetPatentAssignment retrieves patent assignment data

func (*Client) GetPatentAssociatedDocuments added in v1.0.0

func (c *Client) GetPatentAssociatedDocuments(ctx context.Context, applicationNumber string) (any, error)

GetPatentAssociatedDocuments retrieves associated documents

func (*Client) GetPatentAttorney added in v1.0.0

func (c *Client) GetPatentAttorney(ctx context.Context, applicationNumber string) (any, error)

GetPatentAttorney retrieves patent attorney information

func (*Client) GetPatentContinuity added in v1.0.0

func (c *Client) GetPatentContinuity(ctx context.Context, applicationNumber string) (any, error)

GetPatentContinuity retrieves patent continuity data

func (*Client) GetPatentDocuments added in v1.0.0

func (c *Client) GetPatentDocuments(ctx context.Context, applicationNumber string) (*generated.DocumentBag, error)

GetPatentDocuments retrieves patent documents list

func (*Client) GetPatentForeignPriority added in v1.0.0

func (c *Client) GetPatentForeignPriority(ctx context.Context, applicationNumber string) (any, error)

GetPatentForeignPriority retrieves foreign priority data

func (*Client) GetPatentMetaData added in v1.0.0

func (c *Client) GetPatentMetaData(ctx context.Context, applicationNumber string) (any, error)

GetPatentMetaData retrieves patent metadata

func (*Client) GetPatentTransactions added in v1.0.0

func (c *Client) GetPatentTransactions(ctx context.Context, applicationNumber string) (any, error)

GetPatentTransactions retrieves patent transaction history

func (*Client) GetPatentXML added in v1.1.0

func (c *Client) GetPatentXML(ctx context.Context, patentNumber string) (*XMLDocument, error)

GetPatentXML retrieves and parses the XML document for a patent Accepts application numbers, grant numbers, or publication numbers

func (*Client) GetPetitionDecision added in v1.0.0

func (c *Client) GetPetitionDecision(ctx context.Context, recordID string, includeDocuments bool) (*generated.PetitionDecisionIdentifierResponseBag, error)

GetPetitionDecision retrieves a specific petition decision

func (*Client) GetStatusCodes added in v1.0.0

func (c *Client) GetStatusCodes(ctx context.Context) (*generated.StatusCodeSearchResponse, error)

GetStatusCodes retrieves all patent status codes

func (*Client) GetTrialDecision added in v1.2.0

func (c *Client) GetTrialDecision(ctx context.Context, documentIdentifier string) (*generated.DecisionDataResponse, error)

GetTrialDecision retrieves a specific PTAB trial decision by document identifier

func (*Client) GetTrialDecisionsByTrialNumber added in v1.2.0

func (c *Client) GetTrialDecisionsByTrialNumber(ctx context.Context, trialNumber string) (*generated.DecisionDataResponse, error)

GetTrialDecisionsByTrialNumber retrieves all decisions for a specific trial number

func (*Client) GetTrialDocument added in v1.2.0

func (c *Client) GetTrialDocument(ctx context.Context, documentIdentifier string) (*generated.DocumentDataResponse, error)

GetTrialDocument retrieves a specific PTAB trial document by document identifier

func (*Client) GetTrialDocumentsByTrialNumber added in v1.2.0

func (c *Client) GetTrialDocumentsByTrialNumber(ctx context.Context, trialNumber string) (*generated.DocumentDataResponse, error)

GetTrialDocumentsByTrialNumber retrieves all documents for a specific trial number

func (*Client) GetTrialProceeding added in v1.2.0

func (c *Client) GetTrialProceeding(ctx context.Context, trialNumber string) (*generated.ProceedingDataResponse, error)

GetTrialProceeding retrieves a specific PTAB trial proceeding by trial number

func (*Client) GetXMLURLForApplication added in v1.1.0

func (c *Client) GetXMLURLForApplication(ctx context.Context, patentNumber string) (string, DocumentType, error)

GetXMLURLForApplication retrieves the XML URL and document type for a patent

func (*Client) ResolvePatentNumber added in v1.1.0

func (c *Client) ResolvePatentNumber(ctx context.Context, patentNumber string) (string, error)

ResolvePatentNumber resolves any patent number format (application, grant, or publication) to its application number by searching the USPTO API when necessary. For application numbers, returns the normalized number directly. For grant and publication numbers, performs an API search to find the corresponding application number.

func (*Client) SearchAppealDecisions added in v1.2.0

func (c *Client) SearchAppealDecisions(ctx context.Context, query string, offset, limit int32) (*generated.AppealDecisionDataResponse, error)

SearchAppealDecisions searches PTAB appeal decisions

func (*Client) SearchAppealDecisionsDownload added in v1.2.0

func (c *Client) SearchAppealDecisionsDownload(ctx context.Context, req generated.DownloadRequest) ([]byte, error)

SearchAppealDecisionsDownload downloads appeal decisions search results

func (*Client) SearchBulkProducts added in v1.0.0

func (c *Client) SearchBulkProducts(ctx context.Context, query string, offset, limit int) (*generated.BdssResponseBag, error)

SearchBulkProducts searches for bulk data products

func (*Client) SearchInterferenceDecisions added in v1.2.0

func (c *Client) SearchInterferenceDecisions(ctx context.Context, query string, offset, limit int32) (*generated.InterferenceDecisionDataResponse, error)

SearchInterferenceDecisions searches PTAB interference decisions

func (*Client) SearchInterferenceDecisionsDownload added in v1.2.0

func (c *Client) SearchInterferenceDecisionsDownload(ctx context.Context, req generated.PatentDownloadRequest) ([]byte, error)

SearchInterferenceDecisionsDownload downloads interference decisions search results

func (*Client) SearchPatents added in v1.0.0

func (c *Client) SearchPatents(ctx context.Context, query string, offset, limit int32) (*generated.PatentDataResponse, error)

SearchPatents searches for patent applications

func (*Client) SearchPatentsDownload added in v1.0.0

func (c *Client) SearchPatentsDownload(ctx context.Context, req generated.PatentDownloadRequest) ([]byte, error)

SearchPatentsDownload downloads patent search results

func (*Client) SearchPetitions added in v1.0.0

func (c *Client) SearchPetitions(ctx context.Context, query string, offset, limit int32) (*generated.PetitionDecisionResponseBag, error)

SearchPetitions searches for petition decisions

func (*Client) SearchPetitionsDownload added in v1.0.0

func (c *Client) SearchPetitionsDownload(ctx context.Context, req generated.PetitionDecisionDownloadRequest) ([]byte, error)

SearchPetitionsDownload downloads petition search results

func (*Client) SearchTrialDecisions added in v1.2.0

func (c *Client) SearchTrialDecisions(ctx context.Context, query string, offset, limit int32) (*generated.DecisionDataResponse, error)

SearchTrialDecisions searches PTAB trial decisions

func (*Client) SearchTrialDecisionsDownload added in v1.2.0

func (c *Client) SearchTrialDecisionsDownload(ctx context.Context, req generated.DownloadRequest) ([]byte, error)

SearchTrialDecisionsDownload downloads trial decisions search results

func (*Client) SearchTrialDocuments added in v1.2.0

func (c *Client) SearchTrialDocuments(ctx context.Context, query string, offset, limit int32) (*generated.DocumentDataResponse, error)

SearchTrialDocuments searches PTAB trial documents

func (*Client) SearchTrialDocumentsDownload added in v1.2.0

func (c *Client) SearchTrialDocumentsDownload(ctx context.Context, req generated.DownloadRequest) ([]byte, error)

SearchTrialDocumentsDownload downloads trial documents search results

func (*Client) SearchTrialProceedings added in v1.2.0

func (c *Client) SearchTrialProceedings(ctx context.Context, query string, offset, limit int32) (*generated.ProceedingDataResponse, error)

SearchTrialProceedings searches PTAB trial proceedings

func (*Client) SearchTrialProceedingsDownload added in v1.2.0

func (c *Client) SearchTrialProceedingsDownload(ctx context.Context, req generated.DownloadRequest) ([]byte, error)

SearchTrialProceedingsDownload downloads trial proceedings search results

type Config

type Config struct {
	BaseURL    string
	APIKey     string
	UserAgent  string
	MaxRetries int
	RetryDelay int // seconds
	Timeout    int // seconds
}

Config holds client configuration

func DefaultConfig

func DefaultConfig() *Config

DefaultConfig returns default configuration

type Description added in v1.1.0

type Description struct {
	ID         string      `xml:"id,attr"`
	Lang       string      `xml:"lang,attr"`
	Headings   []Heading   `xml:"heading"`
	Paragraphs []Paragraph `xml:"p"`
}

Description represents the detailed description section

func (*Description) ExtractDescriptionText added in v1.1.0

func (d *Description) ExtractDescriptionText() string

ExtractDescriptionText extracts full text from the description

type DocumentID added in v1.1.0

type DocumentID struct {
	Country   string `xml:"country"`
	DocNumber string `xml:"doc-number"`
	Kind      string `xml:"kind"`
	Date      string `xml:"date"`
}

DocumentID represents document identification

type DocumentType added in v1.1.0

type DocumentType int

DocumentType identifies the type of XML document

const (
	DocumentTypeUnknown DocumentType = iota
	DocumentTypeGrant
	DocumentTypeApplication
)

type DrawingsInfo added in v1.1.0

type DrawingsInfo struct {
	ID      string   `xml:"id,attr"`
	Figures []Figure `xml:"figure"`
}

DrawingsInfo contains drawing/figure information

type Figure added in v1.1.0

type Figure struct {
	ID  string `xml:"id,attr"`
	Img Image  `xml:"img"`
}

Figure represents a drawing figure

type Heading added in v1.1.0

type Heading struct {
	ID    string `xml:"id,attr"`
	Level string `xml:"level,attr"`
	Text  string `xml:",chardata"`
}

Heading represents a section heading

type Image added in v1.1.0

type Image struct {
	ID         string `xml:"id,attr"`
	He         string `xml:"he,attr"`
	Wi         string `xml:"wi,attr"`
	File       string `xml:"file,attr"`
	Alt        string `xml:"alt,attr"`
	ImgContent string `xml:"img-content,attr"`
	ImgFormat  string `xml:"img-format,attr"`
}

Image represents an image reference

type Italic added in v1.1.0

type Italic struct {
	Text string `xml:",chardata"`
}

Italic represents italic text

type Paragraph added in v1.1.0

type Paragraph struct {
	ID   string `xml:"id,attr"`
	Num  string `xml:"num,attr"`
	Text string `xml:",chardata"`
	// Support for nested elements
	Sub []Sub    `xml:"sub"`
	Sup []Sup    `xml:"sup"`
	I   []Italic `xml:"i"`
	B   []Bold   `xml:"b"`
}

Paragraph represents a text paragraph with possible nested elements

type PatentApplication added in v1.1.0

type PatentApplication struct {
	XMLName      xml.Name      `xml:"us-patent-application"`
	Lang         string        `xml:"lang,attr"`
	DTDVersion   string        `xml:"dtd-version,attr"`
	File         string        `xml:"file,attr"`
	Status       string        `xml:"status,attr"`
	ID           string        `xml:"id,attr"`
	Country      string        `xml:"country,attr"`
	DateProduced string        `xml:"date-produced,attr"`
	DatePubl     string        `xml:"date-publ,attr"`
	Bibliography *Bibliography `xml:"us-bibliographic-data-application"`
	Abstract     *Abstract     `xml:"abstract"`
	DrawingsInfo *DrawingsInfo `xml:"drawings"`
	Description  *Description  `xml:"description"`
	Claims       *Claims       `xml:"claims"`
}

PatentApplication represents a patent application XML document (ICE DTD 4.6)

type PatentGrant added in v1.1.0

type PatentGrant struct {
	XMLName      xml.Name      `xml:"us-patent-grant"`
	Lang         string        `xml:"lang,attr"`
	DTDVersion   string        `xml:"dtd-version,attr"`
	File         string        `xml:"file,attr"`
	Status       string        `xml:"status,attr"`
	ID           string        `xml:"id,attr"`
	Country      string        `xml:"country,attr"`
	DateProduced string        `xml:"date-produced,attr"`
	DatePubl     string        `xml:"date-publ,attr"`
	Bibliography *Bibliography `xml:"us-bibliographic-data-grant"`
	Abstract     *Abstract     `xml:"abstract"`
	DrawingsInfo *DrawingsInfo `xml:"drawings"`
	Description  *Description  `xml:"description"`
	Claims       *Claims       `xml:"claims"`
}

PatentGrant represents a patent grant XML document (ICE DTD 4.7)

type PatentNumber added in v1.1.0

type PatentNumber struct {
	Original      string           // Original input
	Normalized    string           // Normalized format (digits only)
	ApplicationNo string           // Application number if derivable
	Type          PatentNumberType // Type of number
	Country       string           // Country code (usually "US")
}

PatentNumber represents a normalized patent number

func NormalizePatentNumber added in v1.1.0

func NormalizePatentNumber(input string) (*PatentNumber, error)

NormalizePatentNumber normalizes various patent number formats to application numbers Accepts formats like:

  • Application: "17248024", "17/248,024", "17/248024"
  • Grant: "11646472", "11,646,472", "US 11,646,472 B2"
  • Publication: "20250087686", "US20250087686A1", "US 2025/0087686 A1"

func (*PatentNumber) FormatAsApplication added in v1.1.0

func (pn *PatentNumber) FormatAsApplication() string

FormatAsApplication formats number as application (e.g., 17/248,024)

func (*PatentNumber) FormatAsGrant added in v1.1.0

func (pn *PatentNumber) FormatAsGrant() string

FormatAsGrant formats number as grant (e.g., 11,646,472)

func (*PatentNumber) FormatAsPublication added in v1.1.0

func (pn *PatentNumber) FormatAsPublication() string

FormatAsPublication formats number as publication (e.g., 2025/0087686)

func (*PatentNumber) String added in v1.1.0

func (pn *PatentNumber) String() string

String returns a human-readable representation

func (*PatentNumber) ToApplicationNumber added in v1.1.0

func (pn *PatentNumber) ToApplicationNumber() string

ToApplicationNumber converts a patent number to application number format For application numbers, returns as-is For grant/publication numbers, returns the normalized number which can be used with the API

type PatentNumberType added in v1.1.0

type PatentNumberType int

PatentNumberType indicates the type of patent number

const (
	PatentNumberTypeUnknown PatentNumberType = iota
	PatentNumberTypeApplication
	PatentNumberTypeGrant
	PatentNumberTypePublication
)

type Sub added in v1.1.0

type Sub struct {
	Text string `xml:",chardata"`
}

Sub represents subscript text

type Sup added in v1.1.0

type Sup struct {
	Text string `xml:",chardata"`
}

Sup represents superscript text

type Text added in v1.1.0

type Text struct {
	ID   string `xml:"id,attr"`
	Lang string `xml:"lang,attr"`
	Text string `xml:",chardata"`
}

Text represents simple text with language attribute

type XMLDocument added in v1.1.0

type XMLDocument struct {
	// Grant fields (us-patent-grant)
	Grant *PatentGrant `xml:"us-patent-grant"`
	// Application fields (us-patent-application)
	Application *PatentApplication `xml:"us-patent-application"`
}

XMLDocument represents either a patent grant or application XML document

func ParseApplicationXML added in v1.1.0

func ParseApplicationXML(data []byte) (*XMLDocument, error)

ParseApplicationXML parses patent application XML data (us-patent-application)

func ParseGrantXML added in v1.1.0

func ParseGrantXML(data []byte) (*XMLDocument, error)

ParseGrantXML parses patent grant XML data (us-patent-grant)

func ParseXML added in v1.1.0

func ParseXML(data []byte) (*XMLDocument, error)

ParseXML parses XML data and auto-detects the document type

func ParseXMLWithType added in v1.1.0

func ParseXMLWithType(data []byte, expectedType DocumentType) (*XMLDocument, error)

ParseXMLWithType parses XML data with a known document type hint

func (*XMLDocument) GetAbstract added in v1.1.0

func (d *XMLDocument) GetAbstract() *Abstract

GetAbstract returns the abstract section

func (*XMLDocument) GetClaims added in v1.1.0

func (d *XMLDocument) GetClaims() *Claims

GetClaims returns the claims section

func (*XMLDocument) GetDescription added in v1.1.0

func (d *XMLDocument) GetDescription() *Description

GetDescription returns the description section

func (*XMLDocument) GetDocumentType added in v1.1.0

func (d *XMLDocument) GetDocumentType() DocumentType

GetDocumentType returns the type of document (grant or application)

func (*XMLDocument) GetTitle added in v1.1.0

func (d *XMLDocument) GetTitle() string

GetTitle returns the invention title from either grant or application

Directories

Path Synopsis
cmd
gen command
Command gen processes USPTO ODP swagger files and generates Go code.
Command gen processes USPTO ODP swagger files and generates Go code.
Package generated provides primitives to interact with the openapi HTTP API.
Package generated provides primitives to interact with the openapi HTTP API.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL