curl --request POST \
--url https://api.osaconnection.com/v1/claims/{id}/assignment \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"adjuster_osa_id": "Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w"
}
'import requests
url = "https://api.osaconnection.com/v1/claims/{id}/assignment"
payload = { "adjuster_osa_id": "Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w" }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({adjuster_osa_id: 'Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w'})
};
fetch('https://api.osaconnection.com/v1/claims/{id}/assignment', 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.osaconnection.com/v1/claims/{id}/assignment",
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([
'adjuster_osa_id' => 'Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-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.osaconnection.com/v1/claims/{id}/assignment"
payload := strings.NewReader("{\n \"adjuster_osa_id\": \"Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
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.osaconnection.com/v1/claims/{id}/assignment")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"adjuster_osa_id\": \"Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.osaconnection.com/v1/claims/{id}/assignment")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"adjuster_osa_id\": \"Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w\"\n}"
response = http.request(request)
puts response.read_body{
"id": "9b2e4f70-1c3d-4a5b-8e6f-0a1b2c3d4e5f",
"external_id": "CMS-884530",
"claim_number": "FL-2026-0091877",
"test": false,
"created_at": "2026-09-28T14:40:03Z",
"updated_at": "2026-09-28T15:20:30Z",
"assignment": {
"status": "pending_acceptance",
"adjuster_osa_id": "Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w",
"responded_at": null,
"rejection_reason": null
},
"loss": {
"date": "2026-09-27",
"peril": "flood"
},
"policy": {
"number": "8705127781"
},
"carrier": {
"name": "Gulf Coast Mutual Insurance"
},
"loss_location": {
"street": "77 Davis Boulevard",
"city": "Tampa",
"state": "FL",
"zip": "33606"
},
"policyholder": {
"company_name": "Davis Island Marina LLC",
"email": "office@davismarina.example.com"
}
}Offer a claim to another adjuster
Offers a claim that is still pending, was rejected, or isn’t currently offered to anyone
(unassigned) to another adjuster. This works
exactly like sending a new claim: the new adjuster accepts or rejects it in the app, and
assignment describes the new offer (pending_acceptance, the new adjuster_osa_id,
and no response yet). The previous adjuster loses access to the claim.
A claim that has already been accepted can’t be offered again: 409 claim_already_accepted.
The same adjuster rules as POST /v1/claims apply: a test claim can only be offered to a
test account, real adjusters are invisible to test keys (422 adjuster_not_in_firm), and
a live key naming a test account, or offering a test claim, gets
422 environment_mismatch.
Idempotency-Key is required. Retrying the same request (same method, path and body)
with the same key within 24 hours returns the same status code with the claim’s current
state. The same key with a different request fails with 422 idempotency_key_reused.
curl --request POST \
--url https://api.osaconnection.com/v1/claims/{id}/assignment \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"adjuster_osa_id": "Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w"
}
'import requests
url = "https://api.osaconnection.com/v1/claims/{id}/assignment"
payload = { "adjuster_osa_id": "Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w" }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({adjuster_osa_id: 'Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w'})
};
fetch('https://api.osaconnection.com/v1/claims/{id}/assignment', 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.osaconnection.com/v1/claims/{id}/assignment",
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([
'adjuster_osa_id' => 'Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-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.osaconnection.com/v1/claims/{id}/assignment"
payload := strings.NewReader("{\n \"adjuster_osa_id\": \"Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
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.osaconnection.com/v1/claims/{id}/assignment")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"adjuster_osa_id\": \"Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.osaconnection.com/v1/claims/{id}/assignment")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"adjuster_osa_id\": \"Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w\"\n}"
response = http.request(request)
puts response.read_body{
"id": "9b2e4f70-1c3d-4a5b-8e6f-0a1b2c3d4e5f",
"external_id": "CMS-884530",
"claim_number": "FL-2026-0091877",
"test": false,
"created_at": "2026-09-28T14:40:03Z",
"updated_at": "2026-09-28T15:20:30Z",
"assignment": {
"status": "pending_acceptance",
"adjuster_osa_id": "Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w",
"responded_at": null,
"rejection_reason": null
},
"loss": {
"date": "2026-09-27",
"peril": "flood"
},
"policy": {
"number": "8705127781"
},
"carrier": {
"name": "Gulf Coast Mutual Insurance"
},
"loss_location": {
"street": "77 Davis Boulevard",
"city": "Tampa",
"state": "FL",
"zip": "33606"
},
"policyholder": {
"company_name": "Davis Island Marina LLC",
"email": "office@davismarina.example.com"
}
}Authorizations
Send your API key as a bearer token: Authorization: Bearer osa_live_….
Keys are opaque; each belongs to exactly one firm and one purpose. Keys starting with
osa_test_ reach only test claims and test accounts. The scopes listed on each
operation are the permissions the key needs; GET /v1/me shows the ones your key has.
Headers
A unique value your system generates for each operation, such as a UUID. Reuse the same
value only when retrying the same request. The key is matched with a fingerprint of the
whole request: method, path and body. For 24 hours, a retry of the same request with the
same key returns the same status code with the resource's current state, and creates
nothing new; the same key with a different request fails with
422 idempotency_key_reused.
1 - 255Path Parameters
OSA's claim id, as returned in the claim's id.
Body
The adjuster to offer the claim to.
The adjuster to offer the claim to.
The OSAID of the adjuster to offer the claim to. They must be an active member of your firm.
1 - 128"Xk3pQ9vT2mN8rL5wB7yC1dF4gH6j"
Response
The claim, now pending acceptance by the new adjuster.
A claim as you sent it, with OSA's id, your external_id, and the current assignment.
Optional fields you didn't send are omitted. Adjusters' later edits in the app don't
change these fields.
OSA's id for the claim.
Your own id for the claim.
The carrier's claim number.
true for a test claim: one sent with a test key to a test account. Test claims are
never billed. The value never changes.
When the claim was created.
When something you can see last changed: creation, an offer, an acceptance or a
rejection. This is the field updated_since filters on.
The latest offer of the claim to an adjuster. When you offer the claim to someone else, this describes the new offer and the earlier response is no longer shown.
Show child attributes
Show child attributes
The loss being claimed.
Show child attributes
Show child attributes
The insurance policy, as you sent it.
Show child attributes
Show child attributes
The insurance carrier, as you sent it.
Show child attributes
Show child attributes
The address of the insured property, as you sent it.
Show child attributes
Show child attributes
The policyholder, as you sent it.
Show child attributes
Show child attributes
Your firm's file number.
Your notes for the adjuster.
The date the loss was reported to the carrier.
The date the policyholder was contacted, as you sent it.
The date of the inspection, as you sent it.
Other people or companies involved in the claim.
Show child attributes
Show child attributes
The agent, as you sent it.
Show child attributes
Show child attributes
The mortgage company, as you sent it.
Show child attributes
Show child attributes
The building details, as you sent them.
Show child attributes
Show child attributes
Coverage limits and deductibles, as you sent them.
Show child attributes
Show child attributes
The estimate figures, as you sent them.
Show child attributes
Show child attributes