> This page is for Entria API Reference.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.navipartner.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.navipartner.com/_mcp/server.

# Retrieve the receipt for a completed checkout

GET https://api.entria.app/api/order/confirmation

Call this after the shopper finishes paying on the hosted checkout page, using the signed reference and signature you were handed back, to render a receipt: order number, line items, and totals.

Reference: https://docs.navipartner.com/entria-api/entria-api-reference/order/get-get-order-confirmation

## Request

### Query parameters

- `ref` (string, required) — The cart identifier from the signed reference you were given after checkout.
- `sig` (string, required) — The signature issued alongside `ref`; both must be presented together to prove the request is legitimate.

### Headers

- `x-entria` (string, required) — Identifies which store this request is for. Required on every store-scoped route. It is not authentication and not a secret — it grants no privileges and is safe to send from a browser. You receive the value once your Entria backend has been created and configured. Missing header returns 400; an unknown store returns 404.

## Response

### 200

The finished order, ready to render as a receipt: order number, line items, and totals.

- `status` (enum, required)
  - Allowed values: `processing`
- `order` (map from string to any, optional)
- `discounts` (list of CartDiscount, optional)
- `discountTotal` (double, optional)
- `discountSubtotal` (double, optional)
- `discountTaxTotal` (double, optional)
- `payment` (ApiOrderConfirmationGetResponsesContentApplicationJsonSchemaPayment, optional)

### 202

The order is not readable yet. This covers both an order still being finalized and a transient backend failure, so it is NOT a confirmation that payment succeeded. Poll this endpoint again after a short delay, but only for a bounded number of attempts over a bounded time window — some 202s are a permanent failure that will never turn into a 200. If the bound is reached, stop polling and show the shopper a support path instead of retrying indefinitely.

- `status` (enum, required)
  - Allowed values: `processing`

## Errors

### 401 Unauthorized Error

The reference and signature did not match, or the signature is missing or malformed.

- `error` (string, required)
- `code` (string, optional)
- `details` (list of ErrorResponseDetailsItems, optional) — Per-field validation failures; present when code is VALIDATION_ERROR.
- `success` (boolean, optional, deprecated) — Deprecated. Use code === VALIDATION_ERROR.
- `errors` (list of any, optional, deprecated) — Deprecated. Raw zod issues; use details instead.

### 410 Gone Error

The link has expired (`code: CONFIRMATION_EXPIRED`): its final receipt has already been served once, or 15 minutes have passed since payment was submitted, whether or not it ever produced an outcome. Stop polling. Fetch the confirmation once and keep the response; a reload cannot fetch it again. Returned only where single-use confirmations are enabled.

- `error` (string, required)
- `code` (string, optional)
- `details` (list of ErrorResponseDetailsItems, optional) — Per-field validation failures; present when code is VALIDATION_ERROR.
- `success` (boolean, optional, deprecated) — Deprecated. Use code === VALIDATION_ERROR.
- `errors` (list of any, optional, deprecated) — Deprecated. Raw zod issues; use details instead.

## Types

### CartDiscount

- `promotionId` (string, required)
- `amount` (double, required)
- `code` (string, optional)
- `source` (enum, optional)
  - Allowed values: `CODE`, `AUTOMATIC`
- `removable` (boolean, optional)

### ApiOrderConfirmationGetResponsesContentApplicationJsonSchemaPayment

- `pspReference` (string, required, nullable)

### ErrorResponseDetailsItems

- `path` (string, required)
- `message` (string, required)

## Examples

### Example 1

**Response**

```json
{
  "status": "processing",
  "order": {},
  "discounts": [
    {
      "promotionId": "string",
      "amount": 1.1,
      "code": "string",
      "source": "CODE",
      "removable": true
    }
  ],
  "discountTotal": 1.1,
  "discountSubtotal": 1.1,
  "discountTaxTotal": 1.1,
  "payment": {
    "pspReference": "string"
  }
}
```

**SDK Code**

```python
import requests

url = "https://api.entria.app/api/order/confirmation"

querystring = {"ref":"ref","sig":"sig"}

headers = {"x-entria": "x-entria"}

response = requests.get(url, headers=headers, params=querystring)

print(response.json())
```

```javascript
const url = 'https://api.entria.app/api/order/confirmation?ref=ref&sig=sig';
const options = {method: 'GET', headers: {'x-entria': 'x-entria'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.entria.app/api/order/confirmation?ref=ref&sig=sig"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("x-entria", "x-entria")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.entria.app/api/order/confirmation?ref=ref&sig=sig")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["x-entria"] = 'x-entria'

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.entria.app/api/order/confirmation?ref=ref&sig=sig")
  .header("x-entria", "x-entria")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.entria.app/api/order/confirmation?ref=ref&sig=sig', [
  'headers' => [
    'x-entria' => 'x-entria',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.entria.app/api/order/confirmation?ref=ref&sig=sig");
var request = new RestRequest(Method.GET);
request.AddHeader("x-entria", "x-entria");
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["x-entria": "x-entria"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.entria.app/api/order/confirmation?ref=ref&sig=sig")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Example 2

**Response**

```json
{
  "status": "processing",
  "order": {},
  "discounts": [
    {
      "promotionId": "string",
      "amount": 1.1,
      "code": "string",
      "source": "CODE",
      "removable": true
    }
  ],
  "discountTotal": 1.1,
  "discountSubtotal": 1.1,
  "discountTaxTotal": 1.1,
  "payment": {
    "pspReference": "string"
  }
}
```

**SDK Code**

```python
import requests

url = "https://api.entria.app/api/order/confirmation"

querystring = {"ref":"ref","sig":"sig"}

headers = {"x-entria": "x-entria"}

response = requests.get(url, headers=headers, params=querystring)

print(response.json())
```

```javascript
const url = 'https://api.entria.app/api/order/confirmation?ref=ref&sig=sig';
const options = {method: 'GET', headers: {'x-entria': 'x-entria'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.entria.app/api/order/confirmation?ref=ref&sig=sig"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("x-entria", "x-entria")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.entria.app/api/order/confirmation?ref=ref&sig=sig")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["x-entria"] = 'x-entria'

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.entria.app/api/order/confirmation?ref=ref&sig=sig")
  .header("x-entria", "x-entria")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.entria.app/api/order/confirmation?ref=ref&sig=sig', [
  'headers' => [
    'x-entria' => 'x-entria',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.entria.app/api/order/confirmation?ref=ref&sig=sig");
var request = new RestRequest(Method.GET);
request.AddHeader("x-entria", "x-entria");
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["x-entria": "x-entria"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.entria.app/api/order/confirmation?ref=ref&sig=sig")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```