Evictions API

Customer endpoints

Called with an organization API key (or, from the website, a signed-in session). Everything you need to create, check, submit and follow a case.

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/jurisdictions/resolve

Whether a jurisdiction is served, and its notice rules

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
statequerystringYesTwo-letter state code. In test mode, ZZ is the fictional sandbox state.
countyquerystringNoCounty name, to include county-level rules.
cityquerystringNoCity name, to include city-level rules.

Responses

StatusMeaningBody
200Served status, `handling`, jurisdiction ids and the grounds. In live mode every US state and DC is served with `handling: "attorney_direct"`, `action: null` and, for each ground, `notice: null` and the facts intake requires (`requiredFacts`); anything else is `served: false`. In test mode (`handling: "automated"`) the sandbox jurisdiction answers with its notice rules for each ground.object
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/jurisdictions/resolve
curl "https://api.evictionsapi.com/v1/jurisdictions/resolve?state=ZZ" \
  -H "Authorization: Bearer eak_test_..."

POST /v1/cases

Create a draft case. In live mode the property must be in a US state or DC (422 `unsupported_state`) and the case is an attorney-direct case

Authentication: API key, as Authorization: Bearer eak_test_...

Request body

JSON. Fields not listed are rejected.

NameTypeRequiredDescription
groundstringYesOne of: "nonpayment", "lease_violation", "holdover".
entryPointstringYesOne of: "notice", "filing".
propertyobjectYes—
property.line1stringYes1 to 200 characters.
property.unitstringNo1 to 50 characters.
property.citystringYes1 to 100 characters.
property.countystringNo1 to 100 characters.
property.statestringYesPattern ^[A-Za-z]{2}$.
property.zipstringYesPattern ^\d{5}(-\d{4})?$.
property.ownerOfRecordstringYes1 to 200 characters.
partiesarray of objectYesUp to 20 items.
parties[].rolestringYesOne of: "plaintiff", "defendant".
parties[].namestringYes1 to 200 characters.
parties[].isEntitybooleanNo—
leaseobjectNo—
lease.startDatestringNo—
lease.endDatestringNo—
lease.monthlyRentCentsintegerNo0 or more.
ledgerarray of objectNoUp to 1000 items.
ledger[].datestringIf ledger is sent—
ledger[].typestringIf ledger is sentOne of: "charge", "payment".
ledger[].amountCentsintegerIf ledger is sent0 or more.
ledger[].memostringNo1 to 500 characters.
amountOwedCentsintegerNo0 or more.
violationobjectNo—
violation.descriptionstringIf violation is sent1 to 5000 characters.
violation.datestringIf violation is sent—
attestationsobjectYes—
attestations.authoritybooleanNo—
attestations.notRetaliatorybooleanNo—
attestations.notDiscriminatorybooleanNo—
attestations.servicememberstringNoOne of: "no", "yes", "unknown".
attestations.caresCoveredbooleanNo—
attestations.subsidizedbooleanNo—
priorNoticeobjectNo—
priorNotice.servedDatestringIf priorNotice is sent—
priorNotice.methodstringIf priorNotice is sentOne of: "personal", "substitute", "posting", "certified_mail", "first_class_mail".
priorNotice.periodDaysintegerIf priorNotice is sent1 to 365.
freeTextstringNoUp to 5000 characters.

Responses

StatusMeaningBody
201The draft case.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/cases
curl -X POST https://api.evictionsapi.com/v1/cases \
  -H "Authorization: Bearer eak_test_..." \
  -H "Content-Type: application/json" \
  -d '{
  "ground": "nonpayment",
  "entryPoint": "notice",
  "property": {
    "line1": "1 Main St",
    "city": "Testville",
    "state": "ZZ",
    "zip": "00000",
    "ownerOfRecord": "Pat Landlord"
  },
  "parties": [
    { "role": "plaintiff", "name": "Pat Landlord" },
    { "role": "defendant", "name": "Terry Tenant" }
  ],
  "lease": { "startDate": "2025-01-01", "monthlyRentCents": 150000 },
  "ledger": [
    { "date": "2026-09-01", "type": "charge", "amountCents": 150000 },
    { "date": "2026-10-01", "type": "charge", "amountCents": 150000 },
    { "date": "2026-10-02", "type": "payment", "amountCents": 50000 }
  ],
  "amountOwedCents": 250000,
  "attestations": {
    "authority": true,
    "notRetaliatory": true,
    "notDiscriminatory": true,
    "servicemember": "no",
    "caresCovered": false
  }
}'

GET /v1/cases

List the cases of the key's organization and mode

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
cursorquerystringNoThe nextCursor of the previous page. Omit it for the first page.
limitquerystringNoPage size, 1 to 100. Default 20; a larger value is treated as 100.

Responses

StatusMeaningBody
200A page of cases, newest first.{ items: Case[], nextCursor: string | null }
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/cases
curl "https://api.evictionsapi.com/v1/cases?limit=20" \
  -H "Authorization: Bearer eak_test_..."

GET /v1/cases/{id}

Get a case

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.

Responses

StatusMeaningBody
200The case.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 GET /v1/cases/{id}
curl https://api.evictionsapi.com/v1/cases/case_... \
  -H "Authorization: Bearer eak_test_..."

PATCH /v1/cases/{id}

Change the facts of a draft case

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.

Request body

JSON. Fields not listed are rejected.

NameTypeRequiredDescription
groundstringNoOne of: "nonpayment", "lease_violation", "holdover".
entryPointstringNoOne of: "notice", "filing".
propertyobjectNo—
property.line1stringIf property is sent1 to 200 characters.
property.unitstringNo1 to 50 characters.
property.citystringIf property is sent1 to 100 characters.
property.countystringNo1 to 100 characters.
property.statestringIf property is sentPattern ^[A-Za-z]{2}$.
property.zipstringIf property is sentPattern ^\d{5}(-\d{4})?$.
property.ownerOfRecordstringIf property is sent1 to 200 characters.
partiesarray of objectNoUp to 20 items.
parties[].rolestringIf parties is sentOne of: "plaintiff", "defendant".
parties[].namestringIf parties is sent1 to 200 characters.
parties[].isEntitybooleanNo—
leaseobjectNo—
lease.startDatestringNo—
lease.endDatestringNo—
lease.monthlyRentCentsintegerNo0 or more.
ledgerarray of objectNoUp to 1000 items.
ledger[].datestringIf ledger is sent—
ledger[].typestringIf ledger is sentOne of: "charge", "payment".
ledger[].amountCentsintegerIf ledger is sent0 or more.
ledger[].memostringNo1 to 500 characters.
amountOwedCentsintegerNo0 or more.
violationobjectNo—
violation.descriptionstringIf violation is sent1 to 5000 characters.
violation.datestringIf violation is sent—
attestationsobjectNo—
attestations.authoritybooleanNo—
attestations.notRetaliatorybooleanNo—
attestations.notDiscriminatorybooleanNo—
attestations.servicememberstringNoOne of: "no", "yes", "unknown".
attestations.caresCoveredbooleanNo—
attestations.subsidizedbooleanNo—
priorNoticeobjectNo—
priorNotice.servedDatestringIf priorNotice is sent—
priorNotice.methodstringIf priorNotice is sentOne of: "personal", "substitute", "posting", "certified_mail", "first_class_mail".
priorNotice.periodDaysintegerIf priorNotice is sent1 to 365.
freeTextstringNoUp to 5000 characters.

Responses

StatusMeaningBody
200The updated case.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 PATCH /v1/cases/{id}
curl -X PATCH https://api.evictionsapi.com/v1/cases/case_... \
  -H "Authorization: Bearer eak_test_..." \
  -H "Content-Type: application/json" \
  -d '{ "amountOwedCents": 250000 }'

POST /v1/cases/{id}/documents

Upload evidence for a draft case: a PDF, JPEG or PNG, decided by the file's contents (415 `unsupported_media_type` otherwise, for a live case). For a live case, `purpose: "other"` files can also be added after submission, until the case is finished

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.

Request body

JSON. Fields not listed are rejected.

NameTypeRequiredDescription
filenamestringYes1 to 255 characters.
purposestringYesOne of: "authority", "prior_notice", "prior_notice_proof", "other".
contentBase64stringYesAt least 1 characters.

Responses

StatusMeaningBody
201The stored document.Document
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/cases/{id}/documents
curl -X POST https://api.evictionsapi.com/v1/cases/case_.../documents \
  -H "Authorization: Bearer eak_test_..." \
  -H "Content-Type: application/json" \
  -d '{
  "filename": "deed.pdf",
  "purpose": "authority",
  "contentBase64": "ZGVlZA=="
}'

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

Download a document of the case

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.
docIdpathstringYesThe document id.

Responses

StatusMeaningBody
200The document bytes, with the stored `Content-Type`: `application/pdf`, `image/jpeg` or `image/png`.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/cases/{id}/documents/{docId}
curl https://api.evictionsapi.com/v1/cases/case_.../documents/doc_... \
  -H "Authorization: Bearer eak_test_..." \
  -o document.pdf

POST /v1/cases/{id}/validate

Run the submission gates on a draft

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.

Responses

StatusMeaningBody
200The gate results.GateResults
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/cases/{id}/validate
curl -X POST https://api.evictionsapi.com/v1/cases/case_.../validate \
  -H "Authorization: Bearer eak_test_..."

POST /v1/cases/{id}/submit

Submit a draft that passes every gate. A live case moves to `submitted`, its platform fee becomes a due charge, and we engage a licensed attorney in the property's state; nothing is served or filed until that attorney has reviewed it. A test case enters the sandbox review

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.

Responses

StatusMeaningBody
200The case after submission, and the gate results.{ case: Case, gates: object[] }
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/cases/{id}/submit
curl -X POST https://api.evictionsapi.com/v1/cases/case_.../submit \
  -H "Authorization: Bearer eak_test_..."

GET /v1/cases/{id}/events

Customer-visible events of the case, oldest first

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.

Responses

StatusMeaningBody
200The events.{ items: Event[] }
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/cases/{id}/events
curl https://api.evictionsapi.com/v1/cases/case_.../events \
  -H "Authorization: Bearer eak_test_..."

POST /v1/cases/{id}/report-cure

Report that the tenant has paid or cured. For a live case the report is recorded and passed on to the attorney; the case is not closed automatically

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.

Responses

StatusMeaningBody
200The case.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/cases/{id}/report-cure
curl -X POST https://api.evictionsapi.com/v1/cases/case_.../report-cure \
  -H "Authorization: Bearer eak_test_..."

POST /v1/cases/{id}/withdraw

Withdraw the case. A live case with an attorney already engaged goes `on_hold` with a `withdrawal_requested` event instead, and is withdrawn once the attorney has confirmed that all work has stopped

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.

Responses

StatusMeaningBody
200The case: withdrawn, or on hold while the withdrawal is confirmed.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/cases/{id}/withdraw
curl -X POST https://api.evictionsapi.com/v1/cases/case_.../withdraw \
  -H "Authorization: Bearer eak_test_..."

GET /v1/cases/{id}/charges

The charges on the case, oldest first, and whether online payment is available

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.

Responses

StatusMeaningBody
200The charges. `paymentsEnabled` false: charges show as due and `checkout` answers 409 `payments_unavailable`.{ items: Charge[], paymentsEnabled: boolean }
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/cases/{id}/charges
curl https://api.evictionsapi.com/v1/cases/case_.../charges \
  -H "Authorization: Bearer eak_test_..."

POST /v1/cases/{id}/charges/{chargeId}/checkout

Open a hosted checkout for one due charge. 409 `payments_unavailable` when online payment is off; 409 `charge_not_due` when the charge is paid, void or refunded

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.
chargeIdpathstringYes—

Responses

StatusMeaningBody
200The checkout URL to send the customer to. They return to the case page on the website.{ url: string }
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/cases/{id}/charges/{chargeId}/checkout
curl -X POST https://api.evictionsapi.com/v1/cases/case_.../charges/chargeId_.../checkout \
  -H "Authorization: Bearer eak_test_..."

POST /v1/cases/{id}/charges/{chargeId}/confirm

Check with the payment provider whether the charge's checkout was paid, and record it if so. Safe to repeat. 409 `payments_unavailable` when online payment is off

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.
chargeIdpathstringYes—

Responses

StatusMeaningBody
200The charge as it now is.Charge
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/cases/{id}/charges/{chargeId}/confirm
curl -X POST https://api.evictionsapi.com/v1/cases/case_.../charges/chargeId_.../confirm \
  -H "Authorization: Bearer eak_test_..."

GET /v1/cases/{id}/notes

The messages on the case: the customer's own and ours, oldest first

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.

Responses

StatusMeaningBody
200The messages.{ items: Note[] }
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/cases/{id}/notes
curl https://api.evictionsapi.com/v1/cases/case_.../notes \
  -H "Authorization: Bearer eak_test_..."

POST /v1/cases/{id}/notes

Send us a message about a live case. 409 `attorney_direct_only` for a test case. At most 20 every 10 minutes per organization (429 `rate_limited`)

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.

Request body

JSON. Fields not listed are rejected.

NameTypeRequiredDescription
bodystringYes1 to 5000 characters.

Responses

StatusMeaningBody
201The stored message.Note
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/cases/{id}/notes
curl -X POST https://api.evictionsapi.com/v1/cases/case_.../notes \
  -H "Authorization: Bearer eak_test_..." \
  -H "Content-Type: application/json" \
  -d '{
  "body": "The tenant paid half of the balance yesterday. Does that change the next step?"
}'

POST /v1/cases/{id}/advance

Sandbox only: move a test case on by one step. Runs the step the case is waiting for now (the sandbox reviewer's review, a service or filing update, or the end of the notice period on the case's own sandbox clock), or records the next court outcome as the sandbox reviewer. A live case (nothing about a real case is ever advanced automatically), or a case outside the sandbox jurisdiction, gets 409 `sandbox_only`; a draft, a case on hold or a finished case gets 409 `nothing_to_advance`, as does a step whose last try failed, until its automatic retry (`error.details.retryAt`). While the step is already being taken, the case is returned as it is. At most 60 a minute per organization (429 `rate_limited`)

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe case id.

Responses

StatusMeaningBody
200The case after the step.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/cases/{id}/advance
curl -X POST https://api.evictionsapi.com/v1/cases/case_.../advance \
  -H "Authorization: Bearer eak_test_..."

POST /v1/webhook-endpoints

Register a webhook endpoint

Authentication: API key, as Authorization: Bearer eak_test_...

Request body

JSON. Fields not listed are rejected.

NameTypeRequiredDescription
urlstringYes1 to 2048 characters.

Responses

StatusMeaningBody
201The endpoint. The signing secret appears in this response only. An `Idempotency-Key` header is ignored: every request creates an endpoint, and no response is stored or replayed.object
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/webhook-endpoints
curl -X POST https://api.evictionsapi.com/v1/webhook-endpoints \
  -H "Authorization: Bearer eak_test_..." \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://example.com/webhooks/evictions" }'

GET /v1/webhook-endpoints

List the organization's webhook endpoints in the credential's mode. The signing secret is never shown again

Authentication: API key, as Authorization: Bearer eak_test_...

Responses

StatusMeaningBody
200The endpoints, oldest first.{ items: object[] }
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/webhook-endpoints
curl https://api.evictionsapi.com/v1/webhook-endpoints \
  -H "Authorization: Bearer eak_test_..."

GET /v1/api-keys

List the organization's API keys in the credential's mode, newest first, revoked ones included. The secret is never shown again

Authentication: API key, as Authorization: Bearer eak_test_...

Responses

StatusMeaningBody
200The keys, each with the last four characters of its secret (null for a key created before they were recorded) and when it was revoked, if it was.{ items: object[] }
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/api-keys
curl https://api.evictionsapi.com/v1/api-keys \
  -H "Authorization: Bearer eak_test_..."

POST /v1/api-keys

Create an API key in the credential's mode. A live key can be created only by an owner of the organization, signed in with a session and `X-Evictions-Mode: live` (403 `forbidden` otherwise, also for a live API key); at most 10 active keys per mode (409 `key_limit`)

Authentication: API key, as Authorization: Bearer eak_test_...

Responses

StatusMeaningBody
201The new key. The secret appears in this response only. An `Idempotency-Key` header is ignored: every request creates a key, and no response is stored or replayed.{ id: string, mode: string, secret: string }
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/api-keys
curl -X POST https://api.evictionsapi.com/v1/api-keys \
  -H "Authorization: Bearer eak_test_..."

DELETE /v1/api-keys/{id}

Revoke an API key of the organization and the credential's mode. A key cannot revoke itself (409 `cannot_revoke_current_key`)

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe API key id.

Responses

StatusMeaningBody
204The key is revoked and no longer authenticates. Revoking a revoked key is also 204.—
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 DELETE /v1/api-keys/{id}
curl -X DELETE https://api.evictionsapi.com/v1/api-keys/key_... \
  -H "Authorization: Bearer eak_test_..."

DELETE /v1/webhook-endpoints/{id}

Delete a webhook endpoint. Deliveries still waiting to be retried for it are dropped

Authentication: API key, as Authorization: Bearer eak_test_...

Parameters

NameInTypeRequiredDescription
idpathstringYesThe webhook endpoint id.

Responses

StatusMeaningBody
204The endpoint and its delivery log are deleted.—
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 DELETE /v1/webhook-endpoints/{id}
curl -X DELETE https://api.evictionsapi.com/v1/webhook-endpoints/whe_... \
  -H "Authorization: Bearer eak_test_..."

GET /v1/organization

The caller's organization and its members

Authentication: API key, as Authorization: Bearer eak_test_...

Responses

StatusMeaningBody
200The organization and its members.{ id: string, name: string, verified: boolean, members: object[] }
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/organization
curl https://api.evictionsapi.com/v1/organization \
  -H "Authorization: Bearer eak_test_..."

PATCH /v1/organization

Rename the organization. Only an owner, signed in with a session; an API key or a plain member gets 403

Authentication: Session token, as Authorization: Bearer ess_...

Request body

JSON. Fields not listed are rejected.

NameTypeRequiredDescription
namestringYes1 to 120 characters.

Responses

StatusMeaningBody
200The organization after the change.{ id: string, name: string, verified: boolean, members: object[] }
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 PATCH /v1/organization
curl -X PATCH https://api.evictionsapi.com/v1/organization \
  -H "Authorization: Bearer ess_..." \
  -H "Content-Type: application/json" \
  -d '{ "name": "Acme Property Management" }'

POST /v1/auth/logout

Revoke the session in use

Authentication: Session token, as Authorization: Bearer ess_...

Responses

StatusMeaningBody
204The session is revoked.—
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/auth/logout
curl -X POST https://api.evictionsapi.com/v1/auth/logout \
  -H "Authorization: Bearer ess_..."

POST /v1/auth/password-reset/request

Ask for a password reset link by email. No credential. The answer is the same whether or not the address has an account

Authentication: none

Request body

JSON. Fields not listed are rejected.

NameTypeRequiredDescription
emailstringYes1 to 254 characters.

Responses

StatusMeaningBody
202The request was accepted. If the address belongs to an account that signs in to the site, a single-use link valid for one hour was emailed to it. One account is sent at most 3 such emails an hour: a request beyond that gets this same answer and sends nothing. An `Idempotency-Key` header is ignored.{ ok: boolean }
400The request is invalid.Error
413The request body is too large.Error
429Too many password reset requests from this address: at most 10 every 10 minutes, counting both reset endpoints. `Retry-After` gives the seconds to wait.Error

Example

curl example for POST /v1/auth/password-reset/request
curl -X POST https://api.evictionsapi.com/v1/auth/password-reset/request \
  -H "Content-Type: application/json" \
  -d '{ "email": "pat@example.com" }'

POST /v1/auth/password-reset/confirm

Set a new password with the token from a reset link. No credential. The token works once; every session of the user is revoked

Authentication: none

Request body

JSON. Fields not listed are rejected.

NameTypeRequiredDescription
tokenstringYes1 to 200 characters.
passwordstringYes10 to 200 characters.

Responses

StatusMeaningBody
200The password was changed and every session of the user was revoked. Sign in again with the new password. An `Idempotency-Key` header is ignored.{ ok: boolean }
400`invalid_reset_token`: the token is unknown, already used or expired. `invalid_request`: the password is not 10 to 200 characters (`details.issues` names `password`).Error
413The request body is too large.Error
429Too many password reset requests from this address: at most 10 every 10 minutes, counting both reset endpoints. `Retry-After` gives the seconds to wait.Error
503`busy`: too many password checks are waiting. Nothing was changed and the token is still unused. `Retry-After: 5` gives the seconds to wait; try again.Error

Example

curl example for POST /v1/auth/password-reset/confirm
curl -X POST https://api.evictionsapi.com/v1/auth/password-reset/confirm \
  -H "Content-Type: application/json" \
  -d '{
  "token": "epr_...",
  "password": "a new long passphrase, not this one"
}'

GET /v1/me

The signed-in user, their organization and the modes available to it

Authentication: Session token, as Authorization: Bearer ess_...

Responses

StatusMeaningBody
200The user with their role, the organization and the modes this server offers.{ user: object, organization: object, modes: object }
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/me
curl https://api.evictionsapi.com/v1/me \
  -H "Authorization: Bearer ess_..."

Response objects

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

Case

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.

Document

NameTypeRequiredDescription
idstringYes—
kindstringYesOne of: "evidence", "notice", "filing", "proof", "other".
specIdstring | nullNo—
filenamestringYes—
contentTypestringNoDecided from the file's first bytes when it was stored, never from its name. One of: "application/pdf", "image/jpeg", "image/png".
contentHashstringYesSHA-256 of the document bytes. An attorney approval names these.
createdAtstringNoFormat: date-time.

GateResults

NameTypeRequiredDescription
passedbooleanYes—
resultsarray of objectYes—
results[].gatestringYes—
results[].statusstringYes—
results[].reasonstringNo—

Event

NameTypeRequiredDescription
idstringYes—
actionstringYes—
actorTypestringYes—
fromStatestring | nullYes—
toStatestring | nullYes—
detailanyNo—
createdAtstringYesFormat: date-time.

Charge

An amount owed to the platform for a case: the platform fee, or court or service costs passed on at cost. The attorney's legal fee is never a charge here: it is quoted separately and paid to the attorney.

NameTypeRequiredDescription
idstringYes—
kindstringYesOne of: "platform_fee", "court_costs", "service_costs", "other".
descriptionstringYes—
amountCentsintegerYesUS cents.
statusstringYesOne of: "due", "paid", "void", "refunded".
paidAtstring | nullYesFormat: date-time.
createdAtstringYesFormat: date-time.

Note

A message on a case, between the customer and the platform.

NameTypeRequiredDescription
idstringYes—
authorstringYesOne of: "operator", "customer".
bodystringYes—
createdAtstringYesFormat: date-time.