Evictions API

Attorney endpoints

Called with an attorney token to review a case and record its steps. Today they act on test-mode cases, where a built-in reviewer uses them; a real case is handled by the attorney engaged for it and does not go through these endpoints. An API key cannot call them. Customers integrating the API do not need them; they are listed so the reference is complete.

The examples use https://api.evictionsapi.com and placeholder keys. Conventions shared by all endpoints (errors, idempotency, pagination) are in the API reference.

What is available todayYou can start a real eviction case with Evictions API for a rental property in any US state or DC. After you submit a case, we engage a licensed attorney in the property’s state for it and confirm by email. Nothing is served on a tenant or filed in court until that attorney has reviewed the case.The full statement

Endpoints

GET /v1/attorney/queue

Cases awaiting the attorney's review, and assigned cases that need attention

Authentication: Attorney token, as Authorization: Bearer eut_...

Responses

StatusMeaningBody
200Cases in notice or filing review, and open cases on hold or with a failed job, oldest first.{ items: AttorneyQueueItem[] }
400The request is invalid.Error
401The credential is missing or invalid.Error
403The credential is not allowed to do this.Error
404Not found.Error
409The request conflicts with the current state: for a case, it is not in a state that allows this, or its details were erased (`erased`); for an API key, a limit or the key in use.Error
422The case did not pass a check.Error

Example

curl example for GET /v1/attorney/queue
curl https://api.evictionsapi.com/v1/attorney/queue \
  -H "Authorization: Bearer eut_..."

GET /v1/attorney/cases/{id}

A case with its documents, evidence, gate results, filings, service attempts and full audit trail; the access is audited

Authentication: Attorney token, as Authorization: Bearer eut_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.

Responses

StatusMeaningBody
200The case in attorney detail.AttorneyCase
400The request is invalid.Error
401The credential is missing or invalid.Error
403The credential is not allowed to do this.Error
404Not found.Error
409The request conflicts with the current state: for a case, it is not in a state that allows this, or its details were erased (`erased`); for an API key, a limit or the key in use.Error
422The case did not pass a check.Error

Example

curl example for GET /v1/attorney/cases/{id}
curl https://api.evictionsapi.com/v1/attorney/cases/case_... \
  -H "Authorization: Bearer eut_..."

GET /v1/attorney/cases/{id}/documents/{docId}

Download a document; the access is audited

Authentication: Attorney token, as Authorization: Bearer eut_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.
docIdpathstringYesThe document id.

Responses

StatusMeaningBody
200The document bytes.binaryapplication/pdf
400The request is invalid.Error
401The credential is missing or invalid.Error
403The credential is not allowed to do this.Error
404Not found.Error
409The request conflicts with the current state: for a case, it is not in a state that allows this, or its details were erased (`erased`); for an API key, a limit or the key in use.Error
410`erased`: the details of the case were erased, and the document's content with them.Error
422The case did not pass a check.Error

Example

curl example for GET /v1/attorney/cases/{id}/documents/{docId}
curl https://api.evictionsapi.com/v1/attorney/cases/case_.../documents/doc_... \
  -H "Authorization: Bearer eut_..." \
  -o document.pdf

POST /v1/attorney/cases/{id}/reviews

Approve, reject or request changes, naming the document hashes reviewed

Authentication: Attorney token, as Authorization: Bearer eut_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.

Request body

JSON. Fields not listed are rejected.

NameTypeRequiredDescription
decisionstringYesOne of: "approve", "reject", "request_changes".
notesstringNo1 to 5000 characters.
documentHashesarray of stringYesUp to 50 items.

Responses

StatusMeaningBody
200The case after the decision.Case
400The request is invalid.Error
401The credential is missing or invalid.Error
403The credential is not allowed to do this.Error
404Not found.Error
409The request conflicts with the current state: for a case, it is not in a state that allows this, or its details were erased (`erased`); for an API key, a limit or the key in use.Error
422The case did not pass a check.Error

Example

curl example for POST /v1/attorney/cases/{id}/reviews
curl -X POST https://api.evictionsapi.com/v1/attorney/cases/case_.../reviews \
  -H "Authorization: Bearer eut_..." \
  -H "Content-Type: application/json" \
  -d '{
  "decision": "approve",
  "documentHashes": ["df75f3ea1d63370ba642bde84f53668817f063ac887beb86b8593d78cf5642b9"]
}'

POST /v1/attorney/cases/{id}/outcomes

Record a court outcome

Authentication: Attorney token, as Authorization: Bearer eut_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.

Request body

JSON. The body is one of these shapes. Fields not listed are rejected.

When type is "hearing_scheduled"

NameTypeRequiredDescription
typestringYesAlways "hearing_scheduled".
datestringYes—

When type is "judgment"

NameTypeRequiredDescription
typestringYesAlways "judgment".
outcomestringYesOne of: "plaintiff", "defendant", "dismissed".

When type is "writ_requested"

NameTypeRequiredDescription
typestringYesAlways "writ_requested".

When type is "writ_issued"

NameTypeRequiredDescription
typestringYesAlways "writ_issued".

When type is "closed"

NameTypeRequiredDescription
typestringYesAlways "closed".

Responses

StatusMeaningBody
200The case after the outcome.Case
400The request is invalid.Error
401The credential is missing or invalid.Error
403The credential is not allowed to do this.Error
404Not found.Error
409The request conflicts with the current state: for a case, it is not in a state that allows this, or its details were erased (`erased`); for an API key, a limit or the key in use.Error
422The case did not pass a check.Error

Example

curl example for POST /v1/attorney/cases/{id}/outcomes
curl -X POST https://api.evictionsapi.com/v1/attorney/cases/case_.../outcomes \
  -H "Authorization: Bearer eut_..." \
  -H "Content-Type: application/json" \
  -d '{ "type": "hearing_scheduled", "date": "2026-11-02" }'

Response objects

The objects the attorney endpoints return. Response shapes are described by hand in the OpenAPI document and are deliberately loose.

AttorneyQueueItem

NameTypeRequiredDescription
idstringYes—
modestringYesOne of: "test", "live".
statestringYes—
groundstringYes—
entryPointstringYesOne of: "notice", "filing".
jurisdictionobjectYes—
jurisdiction.statestringYes—
jurisdiction.countystringNo—
attentionAttentionYes—
createdAtstringYesFormat: date-time.
updatedAtstringYesFormat: date-time.

Attention

Whether the case needs the attorney: it is on hold, or a job for it failed for good after its last state change.

NameTypeRequiredDescription
neededbooleanYes—
reasonsarray of stringYes—

AttorneyCase

The case as its assigned attorney sees it. Each read is recorded in the audit log as `tenant_data_viewed`.

NameTypeRequiredDescription
idstringYes—
modestringYesOne of: "test", "live".
statestringYesPosition in the case lifecycle, for example `notice_review` or `filing_submitted`.
heldFromstring | nullNo—
groundstringYes—
entryPointstringYesOne of: "notice", "filing".
courtCaseNumberstring | nullNo—
packVersionsobject | nullNo—
dataobjectYes—
deadlinesarray of objectYes—
deadlines[].namestringYes—
deadlines[].datestringYesFormat: date.
deadlines[].citationstringYes—
documentsarray of DocumentYes—
nextActionobjectYes—
nextAction.bystringYesOne of: "customer", "attorney", "platform", "court", "none".
nextAction.descriptionstringYes—
handlingstringNoWho does the legal work. Every live case is `attorney_direct`: a licensed attorney engaged for the case reviews it, serves the notice and files in court, and the platform records each step. Every test case is `automated`: the sandbox pipeline. One of: "automated", "attorney_direct".
attorneyobject | nullNoThe attorney engaged for an attorney-direct case, once recorded. Null until then, and always null for a test case.
attorney.namestring | nullIf attorney is sent—
attorney.firmstringIf attorney is sent—
attorney.statestringIf attorney is sentThe property's state.
attorney.barNumberstring | nullIf attorney is sentThe attorney's bar number in that state.
erasedbooleanNoWhether the details of the case were erased, which we do case by case on request. An erased case keeps its id, state, dates, deadline names and charges. In `data` the names and the address read `[erased]` (the state and county are kept) and every other fact is gone; `courtCaseNumber` is null; each document keeps its id and `contentHash`, its `filename` reads `[erased]` and downloading it answers 410 `erased`; messages read `[erased]`. Any request that would change the case answers 409 `erased`.
erasedAtstring | nullNoWhen the details were erased. Null for a case that was not erased. Format: date-time.
createdAtstringNoFormat: date-time.
updatedAtstringNoFormat: date-time.
gatesGateResultsYes—
evidencearray of DocumentYes—
filingsarray of FilingYesEvery court filing, oldest first.
serviceAttemptsarray of ServiceAttemptYesEvery service attempt, oldest first.
attentionAttentionYes—
eventsarray of EventYesThe full audit trail, including internal events.

Filing

A submission to the court. Attorney-only.

NameTypeRequiredDescription
idstringYes—
statusstringYes`submitted`, `accepted` or `rejected`.
envelopeIdstring | nullYes—
courtCaseNumberstring | nullYes—
rejectionReasonsarray | nullYesThe court's reasons, when it rejected the filing.
createdAtstringYesFormat: date-time.

ServiceAttempt

One request to serve a document on one defendant. Attorney-only.

NameTypeRequiredDescription
idstringYes—
stagestringYesOne of: "notice", "summons".
methodstringYes—
statusstringYes`pending`, `served` or `failed`.
servedDatestring | nullYesFormat: date.
failureReasonstring | nullYesThe process server's reason, when service failed.
createdAtstringYesFormat: date-time.