> For the complete documentation index, see [llms.txt](https://docs.bullcredtech.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.bullcredtech.com/api-reference/apis-en/proposal-flow/get-proposals-credit-analysis.md).

# 4.1. Check analysis result

**GET** `/proposals/{proposalId}/credit-analysis`

Returns the result of a proposal's credit analysis. Use this route to make **polling** after:

* Trigger the analysis asynchronously via [`POST /proposals/{id}/credit-analysis/async`](/api-reference/apis-en/proposal-flow/post-proposals-credit-analysis.md), `?async=true` or `/credit-analysis/retry/async`; **or**
* Receive `202 Accepted` from the [`POST /proposals/{id}/credit-analysis`](/api-reference/apis-en/proposal-flow/post-proposals-credit-analysis.md) (hybrid mode — synchronous timeout exceeded after \~28s).

The response has three possible behaviors:

* **`202 Accepted`** — analysis still in progress; the client should try again in a few seconds.
* **`200 OK`** — analysis completed (with approved offer or rejection with reason). The shape is the same as the synchronous POST response.
* **`404 Not Found`** — proposal does not exist or analysis has not yet been started.

{% hint style="info" %}
**When to use**

Use this endpoint whenever you triggered an analysis asynchronously. Suggested polling: every 2–3 seconds, with a total timeout of 2 minutes.
{% endhint %}

## URL Parameters

| Parameter    | Type          | Description |
| ------------ | ------------- | ----------- |
| `proposalId` | string (UUID) | Proposal ID |

## Headers

| Header          | Required | Description                                     |
| --------------- | :------: | ----------------------------------------------- |
| `Authorization` |    Yes   | Bearer token from the authorized partner source |

## Response — Analysis in progress (202 Accepted)

Returned while the analysis is still being processed (usually after calling `?async=true` or `/credit-analysis/async`).

```json
{
  "async_processing": true,
  "message": "Credit analysis in progress",
  "proposal_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "status": "CREDIT_ANALYSIS_IN_PROGRESS",
  "processing_started_at": "2026-05-08T14:30:00.000Z",
  "status_url": "/proposals/a1b2c3d4-e5f6-7890-abcd-ef1234567890/credit-analysis"
}
```

| Field                   | Type         | Description                                     |
| ----------------------- | ------------ | ----------------------------------------------- |
| `async_processing`      | boolean      | `true` while the analysis has not finished      |
| `status`                | string       | `CREDIT_ANALYSIS_IN_PROGRESS` during processing |
| `processing_started_at` | string (ISO) | When processing started                         |
| `status_url`            | string       | URL to poll (this same endpoint)                |

## Response — Approved analysis (200 OK)

Same shape as the `POST /credit-analysis` synchronous response — including `offer`, `insuredOffer`, limits and rates.

```json
{
  "message": "Credit analysis completed with generated offer",
  "proposal_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "status": "OFFERS_RECEIVED",
  "offer": {
    "id": "a69660f8-2309-4a55-a0c6-e6a701a04a67",
    "principal_amount": 25153.66,
    "interest_rate": 4.99,
    "installments": 18,
    "installment_amount": 2327.96,
    "total_amount": 41903.28
  },
  "available_margin": "3071.60",
  "maxLoanAmount": 25153.66,
  "maxInstallments": 18,
  "minMonthlyPayment": 1000,
  "bank_skip": false
}
```

## Response — Rejected analysis (200 OK)

When the analysis concluded with a rejection (CPF without margin, insufficient score, etc.):

```json
{
  "proposal_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "status": "REJECTED",
  "rejection_reason": "NO_AVAILABLE_MARGIN",
  "message": "Customer does not have available margin",
  "offer": null,
  "insuredOffer": null,
  "maxLoanAmount": 0,
  "maxInstallments": 0,
  "bank_skip": false
}
```

## Response — Technical failure (200 OK)

When there was a technical failure (Dataprev unavailable, timeout, etc.) and the analysis was marked as `CREDIT_ANALYSIS_FAILED`. The partner can try to reprocess via [`POST /credit-analysis/retry`](/api-reference/apis-en/proposal-flow/post-proposals-credit-analysis-retry.md).

```json
{
  "proposal_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "status": "CREDIT_ANALYSIS_FAILED",
  "error_code": "CRA-DTP-003",
  "message": "Consigned margin consultation unavailable",
  "friendly_message": {
    "title": "Dataprev System Unavailable",
    "description": "At the moment we cannot consult your consigned margin because the Dataprev system (government agency) is temporarily unavailable. Please try again in a few minutes."
  },
  "offer": null,
  "insuredOffer": null
}
```

## Possible Errors

| Code | Message                                        |
| ---- | ---------------------------------------------- |
| 401  | Invalid or missing authentication token        |
| 403  | JWT without permission to consult the proposal |
| 404  | Proposal not found or analysis not yet started |

## Recommended Polling Pattern

```
1. Trigger analysis:   POST /credit-analysis?async=true → 202 Accepted
2. Wait 2 seconds
3. Loop until final response:
     GET /credit-analysis
       → 202: wait 2s and try again
       → 200: stop and use the result
     (timeout: stop after 2 minutes)
4. If result is CREDIT_ANALYSIS_FAILED, try retry:
     POST /credit-analysis/retry?async=true → repeat polling
```

{% hint style="success" %}
**Next Step**

When the result comes with `status=OFFERS_RECEIVED`, proceed to [POST /proposals/{id}/pre-accept](/api-reference/apis-en/proposal-flow/post-proposals-pre-accept.md) confirming the selected offer.
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.bullcredtech.com/api-reference/apis-en/proposal-flow/get-proposals-credit-analysis.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
