> 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 status of a subscription set up during checkout

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

Call this after the shopper completes a recurring-payment checkout (for example, paying for a membership by subscription), using the signed merchant reference and signature you were handed back, to find out whether the recurring contract was set up successfully.

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

## Request

### Query parameters

- `merchantReference` (string, required) — The merchant reference from the signed URL you were given after checkout completed.
- `sig` (string, required) — The signature issued alongside `merchantReference`; 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 subscription setup has reached a final outcome. `status` is `completed` if the recurring contract was created successfully, in which case any resulting membership ids are included, or `failed` if it was not — use this to show the shopper the right outcome.

- `status` (enum, required)
  - Allowed values: `processing`
- `membershipIds` (list of string, optional)

### 202

The recurring contract has not reached a final outcome yet — this 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; 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

### 400 Bad Request Error

The merchant reference is not in the expected format and cannot be looked up.

- `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.

### 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 outcome 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

### ErrorResponseDetailsItems

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

## Examples

### Example 1

**Response**

```json
{
  "status": "processing",
  "membershipIds": [
    "string"
  ]
}
```

**SDK Code**

```python
import requests

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

querystring = {"merchantReference":"merchantReference","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/subscription/confirmation?merchantReference=merchantReference&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/subscription/confirmation?merchantReference=merchantReference&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/subscription/confirmation?merchantReference=merchantReference&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/subscription/confirmation?merchantReference=merchantReference&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/subscription/confirmation?merchantReference=merchantReference&sig=sig', [
  'headers' => [
    'x-entria' => 'x-entria',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://api.entria.app/api/subscription/confirmation?merchantReference=merchantReference&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/subscription/confirmation?merchantReference=merchantReference&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",
  "membershipIds": [
    "string"
  ]
}
```

**SDK Code**

```python
import requests

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

querystring = {"merchantReference":"merchantReference","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/subscription/confirmation?merchantReference=merchantReference&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/subscription/confirmation?merchantReference=merchantReference&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/subscription/confirmation?merchantReference=merchantReference&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/subscription/confirmation?merchantReference=merchantReference&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/subscription/confirmation?merchantReference=merchantReference&sig=sig', [
  'headers' => [
    'x-entria' => 'x-entria',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://api.entria.app/api/subscription/confirmation?merchantReference=merchantReference&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/subscription/confirmation?merchantReference=merchantReference&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()
```