curl --request GET \
--url https://api.phone-harness.com/history \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.phone-harness.com/history"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.phone-harness.com/history', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));[
{
"sid": "abc123def456",
"uid": "exampleuser1",
"provider": "shlut",
"device": "Android",
"phone": null,
"created": 1800000000,
"ready": 1800000140,
"last": 1800000200,
"ended": 1800000230,
"end_reason": "released",
"billing_mode": "metered",
"cost_cents": 70,
"usage_minutes": 2,
"billable_minutes": 2
}
]{
"error": "<string>",
"code": "<string>",
"state": "<string>",
"unsupported": true,
"outcome": "unknown",
"id": "<string>",
"request_key": "<string>",
"cleanup_complete": true,
"balance_cents": 123,
"session": "<string>",
"session_limit": 123,
"active_session_count": 123,
"available_session_slots": 123
}{
"error": "<string>",
"code": "<string>",
"state": "<string>",
"unsupported": true,
"outcome": "unknown",
"id": "<string>",
"request_key": "<string>",
"cleanup_complete": true,
"balance_cents": 123,
"session": "<string>",
"session_limit": 123,
"active_session_count": 123,
"available_session_slots": 123
}{
"error": "<string>",
"code": "<string>",
"state": "<string>",
"unsupported": true,
"outcome": "unknown",
"id": "<string>",
"request_key": "<string>",
"cleanup_complete": true,
"balance_cents": 123,
"session": "<string>",
"session_limit": 123,
"active_session_count": 123,
"available_session_slots": 123
}Get recent history
Return up to 100 finished sessions, ordered by creation time descending. This endpoint has no pagination parameters. Prefer GET /history/page for a complete history.
curl --request GET \
--url https://api.phone-harness.com/history \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.phone-harness.com/history"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.phone-harness.com/history', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));[
{
"sid": "abc123def456",
"uid": "exampleuser1",
"provider": "shlut",
"device": "Android",
"phone": null,
"created": 1800000000,
"ready": 1800000140,
"last": 1800000200,
"ended": 1800000230,
"end_reason": "released",
"billing_mode": "metered",
"cost_cents": 70,
"usage_minutes": 2,
"billable_minutes": 2
}
]{
"error": "<string>",
"code": "<string>",
"state": "<string>",
"unsupported": true,
"outcome": "unknown",
"id": "<string>",
"request_key": "<string>",
"cleanup_complete": true,
"balance_cents": 123,
"session": "<string>",
"session_limit": 123,
"active_session_count": 123,
"available_session_slots": 123
}{
"error": "<string>",
"code": "<string>",
"state": "<string>",
"unsupported": true,
"outcome": "unknown",
"id": "<string>",
"request_key": "<string>",
"cleanup_complete": true,
"balance_cents": 123,
"session": "<string>",
"session_limit": 123,
"active_session_count": 123,
"available_session_slots": 123
}{
"error": "<string>",
"code": "<string>",
"state": "<string>",
"unsupported": true,
"outcome": "unknown",
"id": "<string>",
"request_key": "<string>",
"cleanup_complete": true,
"balance_cents": 123,
"session": "<string>",
"session_limit": 123,
"active_session_count": 123,
"available_session_slots": 123
}Authorizations
Phone Harness account API key (pck_…). The dashboard may use a Clerk session JWT with the same header. Never put an account key in a URL.
Response
Recent history array.
Session ID; history uses sid rather than id.
Display label in plain words ("Android emulator", "iPhone"); not a device connection address.
Session admission. Unix time in seconds.
Readiness. Null if the session never became ready. Unix time in seconds.
Last recorded API activity. Unix time in seconds.
Recorded end of the session, not proof of physical cleanup completion. Unix time in seconds.
metered, disabled Recorded credit debits for this session in US cents.
Ready-to-ended time rounded up to whole minutes.
Usage minutes for metered sessions; zero for disabled billing.
What the phone is: android or ios.
android, ios How it runs: an emulator, or a real device (your own phone on a host).
emulator, device