Analyze Office Action
curl --request POST \
--url https://api.abigail.app/v1/openclaw/analyze \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"application_number": "17200011",
"office_action_text": "Claims 1-5 are rejected under 35 U.S.C. 102(a)(1) as being anticipated by Smith (US 2024/0001234)...",
"office_action_type": "CTNF",
"include_examiner_intel": true
}
'import requests
url = "https://api.abigail.app/v1/openclaw/analyze"
payload = {
"application_number": "17200011",
"office_action_text": "Claims 1-5 are rejected under 35 U.S.C. 102(a)(1) as being anticipated by Smith (US 2024/0001234)...",
"office_action_type": "CTNF",
"include_examiner_intel": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
application_number: '17200011',
office_action_text: 'Claims 1-5 are rejected under 35 U.S.C. 102(a)(1) as being anticipated by Smith (US 2024/0001234)...',
office_action_type: 'CTNF',
include_examiner_intel: true
})
};
fetch('https://api.abigail.app/v1/openclaw/analyze', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.abigail.app/v1/openclaw/analyze",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'application_number' => '17200011',
'office_action_text' => 'Claims 1-5 are rejected under 35 U.S.C. 102(a)(1) as being anticipated by Smith (US 2024/0001234)...',
'office_action_type' => 'CTNF',
'include_examiner_intel' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.abigail.app/v1/openclaw/analyze"
payload := strings.NewReader("{\n \"application_number\": \"17200011\",\n \"office_action_text\": \"Claims 1-5 are rejected under 35 U.S.C. 102(a)(1) as being anticipated by Smith (US 2024/0001234)...\",\n \"office_action_type\": \"CTNF\",\n \"include_examiner_intel\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.abigail.app/v1/openclaw/analyze")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"application_number\": \"17200011\",\n \"office_action_text\": \"Claims 1-5 are rejected under 35 U.S.C. 102(a)(1) as being anticipated by Smith (US 2024/0001234)...\",\n \"office_action_type\": \"CTNF\",\n \"include_examiner_intel\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.abigail.app/v1/openclaw/analyze")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"application_number\": \"17200011\",\n \"office_action_text\": \"Claims 1-5 are rejected under 35 U.S.C. 102(a)(1) as being anticipated by Smith (US 2024/0001234)...\",\n \"office_action_type\": \"CTNF\",\n \"include_examiner_intel\": true\n}"
response = http.request(request)
puts response.read_body{
"analysis_id": "ana_a1b2c3d4e5f6",
"application_number": "17200011",
"rejection_type": "CTNF",
"claim_analyses": [
{
"claim_number": 1,
"status": "rejected",
"basis": "102(a)(1)",
"prior_art": [
"US 2024/0001234"
],
"recommendation": "amend_narrow"
}
],
"glass_box": {
"experts_invoked": [
"claim_analyst",
"prior_art_mapper",
"examiner_profiler"
],
"citations_verified": true,
"confidence_scores": {
"claim_analyst": 0.92
},
"model_versions": {
"claim_analyst": "claude-sonnet-4-20250514"
},
"elapsed_seconds": 12.4
}
}{
"error": true,
"error_code": "missing_api_key",
"message": "Missing X-API-Key header.",
"agent_suggestion": "This endpoint requires an Abigail API key. The user must create one at https://abigail.app and provide it to you."
}Paid Endpoints
Analyze Office Action
POST
/
v1
/
openclaw
/
analyze
Analyze Office Action
curl --request POST \
--url https://api.abigail.app/v1/openclaw/analyze \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"application_number": "17200011",
"office_action_text": "Claims 1-5 are rejected under 35 U.S.C. 102(a)(1) as being anticipated by Smith (US 2024/0001234)...",
"office_action_type": "CTNF",
"include_examiner_intel": true
}
'import requests
url = "https://api.abigail.app/v1/openclaw/analyze"
payload = {
"application_number": "17200011",
"office_action_text": "Claims 1-5 are rejected under 35 U.S.C. 102(a)(1) as being anticipated by Smith (US 2024/0001234)...",
"office_action_type": "CTNF",
"include_examiner_intel": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
application_number: '17200011',
office_action_text: 'Claims 1-5 are rejected under 35 U.S.C. 102(a)(1) as being anticipated by Smith (US 2024/0001234)...',
office_action_type: 'CTNF',
include_examiner_intel: true
})
};
fetch('https://api.abigail.app/v1/openclaw/analyze', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.abigail.app/v1/openclaw/analyze",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'application_number' => '17200011',
'office_action_text' => 'Claims 1-5 are rejected under 35 U.S.C. 102(a)(1) as being anticipated by Smith (US 2024/0001234)...',
'office_action_type' => 'CTNF',
'include_examiner_intel' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.abigail.app/v1/openclaw/analyze"
payload := strings.NewReader("{\n \"application_number\": \"17200011\",\n \"office_action_text\": \"Claims 1-5 are rejected under 35 U.S.C. 102(a)(1) as being anticipated by Smith (US 2024/0001234)...\",\n \"office_action_type\": \"CTNF\",\n \"include_examiner_intel\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.abigail.app/v1/openclaw/analyze")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"application_number\": \"17200011\",\n \"office_action_text\": \"Claims 1-5 are rejected under 35 U.S.C. 102(a)(1) as being anticipated by Smith (US 2024/0001234)...\",\n \"office_action_type\": \"CTNF\",\n \"include_examiner_intel\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.abigail.app/v1/openclaw/analyze")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"application_number\": \"17200011\",\n \"office_action_text\": \"Claims 1-5 are rejected under 35 U.S.C. 102(a)(1) as being anticipated by Smith (US 2024/0001234)...\",\n \"office_action_type\": \"CTNF\",\n \"include_examiner_intel\": true\n}"
response = http.request(request)
puts response.read_body{
"analysis_id": "ana_a1b2c3d4e5f6",
"application_number": "17200011",
"rejection_type": "CTNF",
"claim_analyses": [
{
"claim_number": 1,
"status": "rejected",
"basis": "102(a)(1)",
"prior_art": [
"US 2024/0001234"
],
"recommendation": "amend_narrow"
}
],
"glass_box": {
"experts_invoked": [
"claim_analyst",
"prior_art_mapper",
"examiner_profiler"
],
"citations_verified": true,
"confidence_scores": {
"claim_analyst": 0.92
},
"model_versions": {
"claim_analyst": "claude-sonnet-4-20250514"
},
"elapsed_seconds": 12.4
}
}{
"error": true,
"error_code": "missing_api_key",
"message": "Missing X-API-Key header.",
"agent_suggestion": "This endpoint requires an Abigail API key. The user must create one at https://abigail.app and provide it to you."
}This is the core endpoint. Submit the full text of a USPTO office action and receive
a structured analysis with claim-by-claim breakdown, rejection bases, prior art mapping,
and strategic recommendations.
Every response includes Glass Box transparency metadata.
Typical workflow
- Call
/lookup/{app_number}to get the examiner name - Call
/analyzewith the office action text - Use the returned
analysis_idto call/draft-roa
Office action types
| Code | Meaning |
|---|---|
CTNF | Non-final rejection (default) |
CTFR | Final rejection |
CTED | Restriction requirement |
CTRS | Requirement for information |
Examiner intelligence
Wheninclude_examiner_intel is true (default), the analysis includes examiner
behavior patterns that inform the strategy recommendations. Set to false to skip
this step and reduce processing time.Authorizations
API key for paid endpoints. Create in your account Settings at https://abigail.app
Headers
Your Abigail API key (format: abi_sk_...).
Body
application/json
USPTO application number.
Full text of the office action.
Office action type code. Common: CTNF (non-final), CTFR (final), CTED (restriction).
Include examiner intelligence in the analysis.
⌘I
