> ## Documentation Index
> Fetch the complete documentation index at: https://developers.investorlift.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Errors

> The problem body of the Marketplace API, and every code with its status, its title and its recovery sentence.

<Note>
  The Marketplace API is in a private beta. It answers only for accounts Investorlift has enabled. [Access](/marketplace/access) says how to ask for one. A route shape on these pages can change before the beta ends. The changelog records every change.
</Note>

Every refusal is an RFC 9457 `application/problem+json` body. Switch on `code`, never on `title` or `detail`: the codes
are stable, and the wording can change. The `type` URL points at this page, anchored at the code. The God Mode API has
its own catalogue ([Errors](/guides/concepts/errors)), and the two share no code list.

```json theme={null}
{
  "type": "https://developers.investorlift.com/marketplace/errors#insufficient_scope",
  "title": "Scope missing",
  "status": 403,
  "code": "insufficient_scope",
  "detail": "This operation needs the scope deals:write.",
  "recovery": "Start a new authorization that asks for the scope named in the detail.",
  "request_id": "6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3",
  "scope": "deals:write"
}
```

| Member       | What it is                                                                                                           |
| ------------ | -------------------------------------------------------------------------------------------------------------------- |
| `type`       | `https://developers.investorlift.com/marketplace/errors#<code>`. The URL opens the section of the code on this page. |
| `title`      | A short name of the code, the same for every occurrence.                                                             |
| `status`     | The HTTP status, which the code picks.                                                                               |
| `code`       | The stable string your code switches on.                                                                             |
| `detail`     | What occurred for this one request. When the route adds none, it repeats `recovery`.                                 |
| `recovery`   | One sentence that says what to do next. Show it to a person. Every problem body carries it.                          |
| `request_id` | The id of the request, also in the `X-Request-Id` header. Quote it to support.                                       |

Some codes add a member the caller needs to act:

* `scope` on `insufficient_scope`
* `role` and `required_roles` on `insufficient_role`
* `designation` on `designation_required`
* `agreement_id` on `terms_required`
* `verification_url` on `idv_required`
* `unknown_parameters` on `unknown_parameter`
* `agreement` (`id` and `url`) on `agreement_required`

The reference states these members on each operation that answers the code.

A `400 invalid_parameter` names the parameter in `parameter`. A `409 deal_changed` carries the current terms of the
deal. A `409 offer_exists` and a `409 offer_superseded` name the open round. Every `429` and a
`409 idempotency_in_progress` carry `Retry-After`. A `405` carries `Allow`.

The gateway at `api.investorlift.com` answers four codes before a request reaches the origin. It answers
`401 unauthorized` for a token it cannot verify, and `429 rate_limited` for its request limits. It also answers
`403 not_enabled` and `503 origin_unconfigured`. Every other code comes from the origin.
[Identifiers and the envelope](/marketplace/concepts/identifiers-and-envelope#the-status-rule) states the rule that
picks 409, 422 and 429.

## 400 Bad request

| Code                                      | Title                | What to do                                                                         |
| ----------------------------------------- | -------------------- | ---------------------------------------------------------------------------------- |
| [`invalid_id`](#invalid_id)               | Identifier malformed | Send the public id with its type prefix, for example mdl\_a1b2c3d4e5f6.            |
| [`invalid_parameter`](#invalid_parameter) | Parameter unusable   | Correct the query parameter the detail names, then repeat the call.                |
| [`invalid_body`](#invalid_body)           | Body unusable        | Send a JSON body with the content type application/json.                           |
| [`unknown_parameter`](#unknown_parameter) | Parameter unknown    | Remove the parameter the detail names, because this operation reads no such field. |

## 401 Unauthorized

| Code                            | Title             | What to do                                                                                         |
| ------------------------------- | ----------------- | -------------------------------------------------------------------------------------------------- |
| [`unauthorized`](#unauthorized) | Not authenticated | Send a current access token for this API, and start a new authorization when the token is expired. |

## 402 Payment required

| Code                                            | Title           | What to do                                                                     |
| ----------------------------------------------- | --------------- | ------------------------------------------------------------------------------ |
| [`insufficient_balance`](#insufficient_balance) | Balance too low | Add credits to the organization on Investorlift, then publish the draft again. |

## 403 Forbidden

| Code                                            | Title                          | What to do                                                                                                         |
| ----------------------------------------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------ |
| [`forbidden`](#forbidden)                       | Refused                        | Ask Investorlift support why the account, the client or the organization is stopped.                               |
| [`insufficient_scope`](#insufficient_scope)     | Scope missing                  | Start a new authorization that asks for the scope named in the detail.                                             |
| [`insufficient_role`](#insufficient_role)       | Role too low                   | Ask an owner or an admin of the organization to run this call, or to raise your role.                              |
| [`no_organization`](#no_organization)           | No organization                | Create an organization on Investorlift, then repeat the call.                                                      |
| [`designation_required`](#designation_required) | Designation missing            | Finish the onboarding of the side you call, then repeat the call.                                                  |
| [`terms_required`](#terms_required)             | Terms not accepted             | Accept the Marketplace API Terms on the consent page, then start a new authorization.                              |
| [`client_limit`](#client_limit)                 | Too many clients               | Remove a connected application in your account settings, then connect this one again.                              |
| [`api_offers_disabled`](#api_offers_disabled)   | Seller refuses API offers      | Contact the seller outside the API, because this seller takes no offer through it.                                 |
| [`idv_required`](#idv_required)                 | Identity verification required | Finish identity verification at the verification\_url of this answer, then repeat the call.                        |
| [`not_a_member`](#not_a_member)                 | Not a member                   | Name a user who is a member of the organization, then repeat the call.                                             |
| [`not_enabled`](#not_enabled)                   | Marketplace API not enabled    | Ask Investorlift support for access. The gateway answers this code while the release flag is off for your account. |

## 404 Not found

| Code                      | Title     | What to do                                                                |
| ------------------------- | --------- | ------------------------------------------------------------------------- |
| [`not_found`](#not_found) | Not found | Check the id, and check that the account you call with owns the resource. |

## 405 Method not allowed

| Code                                        | Title              | What to do                                                    |
| ------------------------------------------- | ------------------ | ------------------------------------------------------------- |
| [`method_not_allowed`](#method_not_allowed) | Method not allowed | Use one of the methods the documentation lists for this path. |

## 409 Conflict

| Code                                                  | Title                            | What to do                                                                                               |
| ----------------------------------------------------- | -------------------------------- | -------------------------------------------------------------------------------------------------------- |
| [`address_unavailable`](#address_unavailable)         | Address taken                    | Wait for the other deal on this address to close, or publish a different property.                       |
| [`deal_closed`](#deal_closed)                         | Deal closed                      | Read the deal to see the current status, and act on an open deal instead.                                |
| [`deal_changed`](#deal_changed)                       | Deal changed                     | Read the current terms in the body, take a new preview, then submit again.                               |
| [`draft_under_review`](#draft_under_review)           | Draft under review               | Wait for the Deal Desk to finish its review of this draft, then repeat the call.                         |
| [`resource_exists`](#resource_exists)                 | Already exists                   | Read the resource, because this account already holds the one you create.                                |
| [`resource_limit`](#resource_limit)                   | Limit reached                    | Delete one of these resources, then create the new one.                                                  |
| [`offer_required`](#offer_required)                   | Offer required                   | Send the id of the accepted offer in the body, because this status needs one.                            |
| [`offer_exists`](#offer_exists)                       | Offer already open               | Withdraw or finish your open offer on this deal, then make a new one.                                    |
| [`offer_superseded`](#offer_superseded)               | Round closed                     | Read the id of the open round in the body, then act on that round.                                       |
| [`wrong_side`](#wrong_side)                           | Other side acts next             | Wait for the counterparty to answer, because the current round belongs to them.                          |
| [`idempotency_conflict`](#idempotency_conflict)       | Key reused with a different body | Send a new Idempotency-Key for this body, because the stored key holds another one.                      |
| [`idempotency_in_progress`](#idempotency_in_progress) | Key in progress                  | Wait one second, then repeat the call with the same Idempotency-Key.                                     |
| [`agreement_required`](#agreement_required)           | Agreement required               | Read the agreement at agreement.url, then send accept\_agreement with its id member set to agreement.id. |
| [`organization_required`](#organization_required)     | Organization required            | Create an organization on Investorlift, because the agreement binds to one.                              |
| [`lead_locked`](#lead_locked)                         | Lead locked                      | Read the lead to see its current status, because a closed lead takes no change.                          |
| [`person_exists`](#person_exists)                     | Person already a lead            | Read the leads of this deal, because this person is already one of them.                                 |
| [`strike_exists`](#strike_exists)                     | Strike already filed             | Read the buyer, because this organization already filed its one strike against them.                     |
| [`strike_window_closed`](#strike_window_closed)       | Strike window closed             | File a strike inside 90 days of the last act of the buyer on your deal.                                  |
| [`webhook_limit`](#webhook_limit)                     | Too many endpoints               | Delete an endpoint of this side, then create the new one.                                                |

## 422 Unprocessable content

| Code                                                | Title                    | What to do                                                                        |
| --------------------------------------------------- | ------------------------ | --------------------------------------------------------------------------------- |
| [`validation_failed`](#validation_failed)           | Body failed validation   | Correct each field the detail names, then repeat the call.                        |
| [`deal_incomplete`](#deal_incomplete)               | Draft incomplete         | Add each field the detail names to the draft, then publish it again.              |
| [`preview_expired`](#preview_expired)               | Preview expired          | Take a new preview, then submit inside five minutes.                              |
| [`preview_mismatch`](#preview_mismatch)             | Preview does not match   | Take a new preview for the terms you submit, then submit that token.              |
| [`below_floor`](#below_floor)                       | Offer below the floor    | Raise the offer amount, then submit a new preview and a new offer.                |
| [`requirement_unmet`](#requirement_unmet)           | Seller requirement unmet | Meet the requirement the detail names, then submit a new preview and a new offer. |
| [`proof_of_funds_missing`](#proof_of_funds_missing) | Proof of funds missing   | Upload a proof of funds document, then repeat the call.                           |
| [`proof_of_funds_expired`](#proof_of_funds_expired) | Proof of funds expired   | Upload a current proof of funds document, then repeat the call.                   |
| [`invalid_transition`](#invalid_transition)         | Transition not allowed   | Read the resource, then pick a status the detail lists as a next step.            |
| [`webhook_url_refused`](#webhook_url_refused)       | Webhook URL refused      | Send an https URL on a public host, because a private address takes no delivery.  |

## 429 Too many requests

| Code                                      | Title                | What to do                                                                           |
| ----------------------------------------- | -------------------- | ------------------------------------------------------------------------------------ |
| [`cap_reached`](#cap_reached)             | Cap reached          | Wait for the time in Retry-After, or raise your trust tier with the step in GET /me. |
| [`daily_cap_reached`](#daily_cap_reached) | Daily cap reached    | Wait for the next day in UTC, or raise your trust tier with the step in GET /me.     |
| [`duplicate_inquiry`](#duplicate_inquiry) | Inquiry already sent | Send one inquiry of each type for one deal in 24 hours, then repeat the call.        |
| [`rate_limited`](#rate_limited)           | Too many requests    | Wait for the time in Retry-After, then repeat the call.                              |

## 503 Service unavailable

| Code                                          | Title               | What to do                                                                                                                |
| --------------------------------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| [`origin_error`](#origin_error)               | Service unavailable | Repeat the call in a minute, and tell Investorlift support when the answer stays the same.                                |
| [`origin_unconfigured`](#origin_unconfigured) | Service unavailable | Repeat the call in a minute, and tell Investorlift support when the answer stays the same. The gateway answers this code. |

## Each code

One section per code, the anchor the `type` URL points at. The first line is the status and the title. The second is the
recovery sentence. A third line, where one exists, names the members the body adds.

<h3 id="invalid_id">
  `invalid_id`
</h3>

**400 Identifier malformed.** Send the public id with its type prefix, for example mdl\_a1b2c3d4e5f6.
[Identifiers and the envelope](/marketplace/concepts/identifiers-and-envelope#identifiers) lists the prefixes.

<h3 id="invalid_parameter">
  `invalid_parameter`
</h3>

**400 Parameter unusable.** Correct the query parameter the detail names, then repeat the call. The body names the
parameter in `parameter`. A cursor from another account or another query, and a missing or overlong `Idempotency-Key`
header, answer this code too.

<h3 id="invalid_body">
  `invalid_body`
</h3>

**400 Body unusable.** Send a JSON body with the content type application/json.

<h3 id="unknown_parameter">
  `unknown_parameter`
</h3>

**400 Parameter unknown.** Remove the parameter the detail names, because this operation reads no such field. The body
lists the names in `unknown_parameters`. Every schema is strict, so a field the operation does not read is a refusal,
never a silent drop.

<h3 id="unauthorized">
  `unauthorized`
</h3>

**401 Not authenticated.** Send a current access token for this API, and start a new authorization when the token is
expired. A token without the marketplace audience, a suspended or deleted account, and an account with no verified
email address answer this code too.

<h3 id="insufficient_balance">
  `insufficient_balance`
</h3>

**402 Balance too low.** Add credits to the organization on Investorlift, then publish the draft again. The API never
charges a card.

<h3 id="forbidden">
  `forbidden`
</h3>

**403 Refused.** Ask Investorlift support why the account, the client or the organization is stopped.

<h3 id="insufficient_scope">
  `insufficient_scope`
</h3>

**403 Scope missing.** Start a new authorization that asks for the scope named in the detail. The body names the scope
in `scope`.

<h3 id="insufficient_role">
  `insufficient_role`
</h3>

**403 Role too low.** Ask an owner or an admin of the organization to run this call, or to raise your role. The body
names the roles that run the operation in `required_roles`. It names your role in `role`, or null when you hold none.

<h3 id="no_organization">
  `no_organization`
</h3>

**403 No organization.** Create an organization on Investorlift, then repeat the call.

<h3 id="designation_required">
  `designation_required`
</h3>

**403 Designation missing.** Finish the onboarding of the side you call, then repeat the call. The body names the side
in `designation`: `seller` or `buyer`.

<h3 id="terms_required">
  `terms_required`
</h3>

**403 Terms not accepted.** Accept the Marketplace API Terms on the consent page, then start a new authorization. The
body names the agreement in `agreement_id`.

<h3 id="client_limit">
  `client_limit`
</h3>

**403 Too many clients.** Remove a connected application in your account settings, then connect this one again. A
dynamically registered client holds consent from one organization and three users.

<h3 id="api_offers_disabled">
  `api_offers_disabled`
</h3>

**403 Seller refuses API offers.** Contact the seller outside the API, because this seller takes no offer through it.

<h3 id="idv_required">
  `idv_required`
</h3>

**403 Identity verification required.** Finish identity verification at the verification\_url of this answer, then
repeat the call. The body carries the link in `verification_url`.

<h3 id="not_a_member">
  `not_a_member`
</h3>

**403 Not a member.** Name a user who is a member of the organization, then repeat the call.

<h3 id="not_found">
  `not_found`
</h3>

**404 Not found.** Check the id, and check that the account you call with owns the resource. A resource of another
account answers this code, never a 403.

<h3 id="method_not_allowed">
  `method_not_allowed`
</h3>

**405 Method not allowed.** Use one of the methods the documentation lists for this path. The `Allow` header lists them.

<h3 id="address_unavailable">
  `address_unavailable`
</h3>

**409 Address taken.** Wait for the other deal on this address to close, or publish a different property. When the
other deal is your own organization's, the body names it. Otherwise the body names no owner.

<h3 id="deal_closed">
  `deal_closed`
</h3>

**409 Deal closed.** Read the deal to see the current status, and act on an open deal instead.

<h3 id="deal_changed">
  `deal_changed`
</h3>

**409 Deal changed.** Read the current terms in the body, take a new preview, then submit again.

<h3 id="draft_under_review">
  `draft_under_review`
</h3>

**409 Draft under review.** Wait for the Deal Desk to finish its review of this draft, then repeat the call. Every
route under `/sell/drafts/{draft_id}` can answer this code, the read included.

<h3 id="resource_exists">
  `resource_exists`
</h3>

**409 Already exists.** Read the resource, because this account already holds the one you create.
`POST /sell/reviews/{review_id}/response` answers this code for a review that already carries a response.

<h3 id="resource_limit">
  `resource_limit`
</h3>

**409 Limit reached.** Delete one of these resources, then create the new one. One buyer keeps five buy boxes, and the
sixth `POST /buy/buy-boxes` answers this code.

<h3 id="offer_required">
  `offer_required`
</h3>

**409 Offer required.** Send the id of the accepted offer in the body, because this status needs one.

<h3 id="offer_exists">
  `offer_exists`
</h3>

**409 Offer already open.** Withdraw or finish your open offer on this deal, then make a new one. The body names the
open round.

<h3 id="offer_superseded">
  `offer_superseded`
</h3>

**409 Round closed.** Read the id of the open round in the body, then act on that round.

<h3 id="wrong_side">
  `wrong_side`
</h3>

**409 Other side acts next.** Wait for the counterparty to answer, because the current round belongs to them.

<h3 id="idempotency_conflict">
  `idempotency_conflict`
</h3>

**409 Key reused with a different body.** Send a new Idempotency-Key for this body, because the stored key holds another
one. [Idempotency](/marketplace/concepts/idempotency) has the key rules.

<h3 id="idempotency_in_progress">
  `idempotency_in_progress`
</h3>

**409 Key in progress.** Wait one second, then repeat the call with the same Idempotency-Key. The response carries
`Retry-After: 1`.

<h3 id="agreement_required">
  `agreement_required`
</h3>

**409 Agreement required.** Read the agreement at agreement.url, then send accept\_agreement with its id member set to
agreement.id. The body of the 409 carries `agreement: { id, url }`. The address block of the deal read carries the same
`agreement.id` and `agreement.url`, with `accepted`.

Show the agreement at the URL to the person. Then send `accept_agreement: { "id": "<agreement.id>" }` with the address
request. This accepts the Non-Circumvention Agreement for that deal.

<h3 id="organization_required">
  `organization_required`
</h3>

**409 Organization required.** Create an organization on Investorlift, because the agreement binds to one.

<h3 id="lead_locked">
  `lead_locked`
</h3>

**409 Lead locked.** Read the lead to see its current status, because a closed lead takes no change.

<h3 id="person_exists">
  `person_exists`
</h3>

**409 Person already a lead.** Read the leads of this deal, because this person is already one of them. The body names
no id, because the API does not reveal the match.

<h3 id="strike_exists">
  `strike_exists`
</h3>

**409 Strike already filed.** Read the buyer, because this organization already filed its one strike against them.
`GET /sell/buyers/{buyer_id}` carries that strike in `strike`.

<h3 id="strike_window_closed">
  `strike_window_closed`
</h3>

**409 Strike window closed.** File a strike inside 90 days of the last act of the buyer on your deal.
[Trust and limits](/marketplace/concepts/trust-and-limits#strikes) has the strike rules.

<h3 id="webhook_limit">
  `webhook_limit`
</h3>

**409 Too many endpoints.** Delete an endpoint of this side, then create the new one. Each side holds ten endpoints.

<h3 id="validation_failed">
  `validation_failed`
</h3>

**422 Body failed validation.** Correct each field the detail names, then repeat the call.

<h3 id="deal_incomplete">
  `deal_incomplete`
</h3>

**422 Draft incomplete.** Add each field the detail names to the draft, then publish it again.

<h3 id="preview_expired">
  `preview_expired`
</h3>

**422 Preview expired.** Take a new preview, then submit inside five minutes.

<h3 id="preview_mismatch">
  `preview_mismatch`
</h3>

**422 Preview does not match.** Take a new preview for the terms you submit, then submit that token.

<h3 id="below_floor">
  `below_floor`
</h3>

**422 Offer below the floor.** Raise the offer amount, then submit a new preview and a new offer. The body names no
figure unless the seller disclosed the floor.

<h3 id="requirement_unmet">
  `requirement_unmet`
</h3>

**422 Seller requirement unmet.** Meet the requirement the detail names, then submit a new preview and a new offer.

<h3 id="proof_of_funds_missing">
  `proof_of_funds_missing`
</h3>

**422 Proof of funds missing.** Upload a proof of funds document, then repeat the call.

<h3 id="proof_of_funds_expired">
  `proof_of_funds_expired`
</h3>

**422 Proof of funds expired.** Upload a current proof of funds document, then repeat the call.

<h3 id="invalid_transition">
  `invalid_transition`
</h3>

**422 Transition not allowed.** Read the resource, then pick a status the detail lists as a next step.

<h3 id="webhook_url_refused">
  `webhook_url_refused`
</h3>

**422 Webhook URL refused.** Send an https URL on a public host, because a private address takes no delivery.
[Webhooks and events](/marketplace/concepts/webhooks-and-events#endpoints) lists the checks.

<h3 id="cap_reached">
  `cap_reached`
</h3>

**429 Cap reached.** Wait for the time in Retry-After, or raise your trust tier with the step in GET /me. The body names
the cap. [Trust and limits](/marketplace/concepts/trust-and-limits) has the table.

<h3 id="daily_cap_reached">
  `daily_cap_reached`
</h3>

**429 Daily cap reached.** Wait for the next day in UTC, or raise your trust tier with the step in GET /me.
`Retry-After` counts the seconds to the next midnight UTC.

<h3 id="duplicate_inquiry">
  `duplicate_inquiry`
</h3>

**429 Inquiry already sent.** Send one inquiry of each type for one deal in 24 hours, then repeat the call. The two
types are `inquiry` and `address_request`. The response carries `Retry-After: 86400`, and the body names `deal_id` and
`type`.

<h3 id="rate_limited">
  `rate_limited`
</h3>

**429 Too many requests.** Wait for the time in Retry-After, then repeat the call.

<h3 id="origin_error">
  `origin_error`
</h3>

**503 Service unavailable.** Repeat the call in a minute, and tell Investorlift support when the answer stays the same.

## Answers from the gateway

The gateway at `api.investorlift.com` answers four codes before a request reaches the origin. Two of them,
`401 unauthorized` and `429 rate_limited`, have their sections above. The two below are the gateway's own. Every body
has the same shape as the codes above, with a `request_id`. Every other code comes from the origin.

<h3 id="not_enabled">
  `not_enabled`
</h3>

**403 Marketplace API not enabled.** The release flag is off for your account. Ask `support@investorlift.com` for access
with the subject "Marketplace API access". [Access](/marketplace/access) says what the email carries. The gateway
forwards nothing while the flag is off.

<h3 id="origin_unconfigured">
  `origin_unconfigured`
</h3>

**503 Service unavailable.** The gateway environment has no marketplace origin. This is an operator's error, not yours.
Repeat the call in a minute, and tell Investorlift support when the answer stays the same.


## Related topics

- [Errors](/guides/concepts/errors.md)
- [Errors over MCP](/mcp/errors.md)
- [SDKs](/guides/sdks.md)
- [When a call fails](/guides/walkthroughs/when-it-fails.md)
- [The two protocol legs](/mcp/protocol.md)
