MENU navbar-image

Introduction

This documentation aims to provide all the information you need to work with our API.

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {FIREBASE_ID_TOKEN}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

Send a Firebase Authentication ID token as Authorization: Bearer {FIREBASE_ID_TOKEN}.

Account

Lookup accounts

Example request:
curl --request GET \
    --get "https://api.pantropica.org/api/v1/account/architecto" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"emailAddress\": \"b\"
}"
const url = new URL(
    "https://api.pantropica.org/api/v1/account/architecto"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "emailAddress": "b"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 30
x-ratelimit-remaining: 24
access-control-allow-origin: *
access-control-allow-methods: GET, POST, PUT, DELETE, OPTIONS
access-control-allow-credentials: true
access-control-max-age: 86400
access-control-allow-headers: Authorization, Content-Type, X-Requested-With
 

{
    "success": false,
    "error": "The email address field must be a valid email address."
}
 

Request      

GET api/v1/account/{emailAddress}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

emailAddress   string     

Example: architecto

Body Parameters

emailAddress   string     

Must be a valid email address. Must not be greater than 255 characters. Example: b

Authentication

Firebase Login

Example request:
curl --request POST \
    "https://api.pantropica.org/api/v1/login" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"user@example.com\",
    \"password\": \"password\"
}"
const url = new URL(
    "https://api.pantropica.org/api/v1/login"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "user@example.com",
    "password": "password"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/login

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

email   string     

The email address of the user. Must be a valid email address. Example: user@example.com

password   string     

The password of the user. Example: password

Firebase refresh

Example request:
curl --request POST \
    "https://api.pantropica.org/api/v1/auth/refresh" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"refresh_token\": \"AMf-vByExampleRefreshToken\"
}"
const url = new URL(
    "https://api.pantropica.org/api/v1/auth/refresh"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "refresh_token": "AMf-vByExampleRefreshToken"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/auth/refresh

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

refresh_token   string     

The Firebase refresh token. Example: AMf-vByExampleRefreshToken

Breeze

Request an API login code.

Example request:
curl --request POST \
    "https://api.pantropica.org/api/v1/login-code/request" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"user@example.com\"
}"
const url = new URL(
    "https://api.pantropica.org/api/v1/login-code/request"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "user@example.com"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/login-code/request

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

email   string     

The email address that should receive the login code. Must be a valid email address. Must not be greater than 255 characters. Example: user@example.com

Verify an API login code.

Example request:
curl --request POST \
    "https://api.pantropica.org/api/v1/login-code/verify" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"user@example.com\",
    \"code\": \"123456\"
}"
const url = new URL(
    "https://api.pantropica.org/api/v1/login-code/verify"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "user@example.com",
    "code": "123456"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/login-code/verify

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

email   string     

The email address that received the login code. Must be a valid email address. Must not be greater than 255 characters. Example: user@example.com

code   string     

The six-digit login code from the email. Must be 6 digits. Example: 123456

Inbound

Endpoints for that handles incomming callbacks.

Process the data

requires authentication

Adds a job to the queue.

Example request:
curl --request POST \
    "https://api.pantropica.org/api/v1/inbound" \
    --header "Authorization: Bearer {FIREBASE_ID_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"credentials\": {
        \"email\": \"customer@example.com\",
        \"firstname\": \"Jane\",
        \"lastname\": \"Doe\",
        \"country\": \"NL\",
        \"street\": \"Hoofdstraat 1\",
        \"town\": \"Amsterdam\",
        \"zipcode\": \"1011 AB\"
    },
    \"cards\": [
        {
            \"firstname\": \"Jane\",
            \"lastname\": \"Doe\",
            \"date_of_birth\": \"1990-01-31\",
            \"base64\": \"data:image\\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB\",
            \"type\": \"adult\"
        }
    ],
    \"TrxId\": \"1234567890\",
    \"PayId\": \"9876543210\"
}"
const url = new URL(
    "https://api.pantropica.org/api/v1/inbound"
);

const headers = {
    "Authorization": "Bearer {FIREBASE_ID_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "credentials": {
        "email": "customer@example.com",
        "firstname": "Jane",
        "lastname": "Doe",
        "country": "NL",
        "street": "Hoofdstraat 1",
        "town": "Amsterdam",
        "zipcode": "1011 AB"
    },
    "cards": [
        {
            "firstname": "Jane",
            "lastname": "Doe",
            "date_of_birth": "1990-01-31",
            "base64": "data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB",
            "type": "adult"
        }
    ],
    "TrxId": "1234567890",
    "PayId": "9876543210"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/inbound

Headers

Authorization        

Example: Bearer {FIREBASE_ID_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

credentials   object     

The customer details for the membership order.

email   string     

The customer email address. Must not be greater than 255 characters. Example: customer@example.com

firstname   string     

The customer first name. Must not be greater than 255 characters. Example: Jane

lastname   string     

The customer last name. Must not be greater than 255 characters. Example: Doe

country   string     

The customer country code. Must not be greater than 255 characters. Example: NL

street   string     

The customer street and house number. Must not be greater than 255 characters. Example: Hoofdstraat 1

town   string     

The customer city or town. Must not be greater than 255 characters. Example: Amsterdam

zipcode   string     

The customer postal code. Must not be greater than 255 characters. Example: 1011 AB

cards   object[]     

A membership card holder.

firstname   string     

The card holder first name. Must not be greater than 255 characters. Example: Jane

lastname   string     

The card holder last name. Must not be greater than 255 characters. Example: Doe

date_of_birth   string     

The card holder date of birth. Must not be greater than 255 characters. Example: 1990-01-31

base64   string     

The card holder photo as a base64-encoded image. Example: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB

type   string     

The membership card type. Must not be greater than 255 characters. Example: adult

TrxId   string     

The transaction ID from the payment provider. Must not be greater than 255 characters. Example: 1234567890

PayId   string     

The payment ID from the payment provider. Must not be greater than 255 characters. Example: 9876543210

Newsletter

Endpoints for that handles newsletter subscriptions

Add user

requires authentication

Add and assign a user to the newsletter environment.

Example request:
curl --request GET \
    --get "https://api.pantropica.org/api/v1/newsletter/user/architecto" \
    --header "Authorization: Bearer {FIREBASE_ID_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"user@example.com\"
}"
const url = new URL(
    "https://api.pantropica.org/api/v1/newsletter/user/architecto"
);

const headers = {
    "Authorization": "Bearer {FIREBASE_ID_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "user@example.com"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 30
x-ratelimit-remaining: 29
access-control-allow-origin: *
access-control-allow-methods: GET, POST, PUT, DELETE, OPTIONS
access-control-allow-credentials: true
access-control-max-age: 86400
access-control-allow-headers: Authorization, Content-Type, X-Requested-With
 

{
    "success": false,
    "error": "Invalid or expired token"
}
 

Request      

GET api/v1/newsletter/user/{emailAddress}

Headers

Authorization        

Example: Bearer {FIREBASE_ID_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

emailAddress   string     

Example: architecto

Body Parameters

email   string     

The email address of the user. Must be a valid email address. Example: user@example.com

Payments

Endpoints for generating payment links based on the given parameters.

Request a payment link

requires authentication

Example request:
curl --request GET \
    --get "https://api.pantropica.org/api/v1/payments" \
    --header "Authorization: Bearer {FIREBASE_ID_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"serviceId\": \"SL-1234-5678\",
    \"amount\": {
        \"value\": 2495,
        \"currency\": \"EUR\"
    },
    \"reference\": \"MEMBERSHIP-2026-0001\",
    \"paymentMethod\": {
        \"id\": 10
    },
    \"integration\": {
        \"test\": true
    }
}"
const url = new URL(
    "https://api.pantropica.org/api/v1/payments"
);

const headers = {
    "Authorization": "Bearer {FIREBASE_ID_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "serviceId": "SL-1234-5678",
    "amount": {
        "value": 2495,
        "currency": "EUR"
    },
    "reference": "MEMBERSHIP-2026-0001",
    "paymentMethod": {
        "id": 10
    },
    "integration": {
        "test": true
    }
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
access-control-allow-methods: GET, POST, PUT, DELETE, OPTIONS
access-control-allow-credentials: true
access-control-max-age: 86400
access-control-allow-headers: Authorization, Content-Type, X-Requested-With
 

{
    "success": false,
    "error": "Invalid or expired token"
}
 

Request      

GET api/v1/payments

Headers

Authorization        

Example: Bearer {FIREBASE_ID_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

serviceId   string     

The Pay.nl service ID used to create the order. Example: SL-1234-5678

amount   object     

The payment amount.

value   integer     

The payment amount in cents. Must be at least 1. Example: 2495

currency   string     

The ISO 4217 currency code. Must be 3 characters. Example: EUR

Must be one of:
  • EUR
reference   string     

The merchant reference for this payment. Must not be greater than 255 characters. Example: MEMBERSHIP-2026-0001

paymentMethod   object     

The selected Pay.nl payment method.

id   integer     

The Pay.nl payment method ID. Example: 10

integration   object  optional    

Optional integration settings for the payment.

test   boolean  optional    

Whether the payment should be created in test mode. Example: true

Recreatex

Endpoints that interact with the Recreatex API.

Get article prices

Example request:
curl --request GET \
    --get "https://api.pantropica.org/api/v1/recreatex/prices" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"Criteria\": {
        \"ArticleGroupId\": \"d4420e2f-33bf-ed11-9595-a98758ce176c\",
        \"Includes\": {
            \"Prices\": true
        }
    }
}"
const url = new URL(
    "https://api.pantropica.org/api/v1/recreatex/prices"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "Criteria": {
        "ArticleGroupId": "d4420e2f-33bf-ed11-9595-a98758ce176c",
        "Includes": {
            "Prices": true
        }
    }
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 30
x-ratelimit-remaining: 28
access-control-allow-origin: *
access-control-allow-methods: GET, POST, PUT, DELETE, OPTIONS
access-control-allow-credentials: true
access-control-max-age: 86400
access-control-allow-headers: Authorization, Content-Type, X-Requested-With
 

{
    "child": 30,
    "adult": 46.5
}
 

Request      

GET api/v1/recreatex/prices

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

Criteria   object     

The criteria used for the Recreatex subscription article prices lookup.

ArticleGroupId   string     

The Recreatex article group ID. Example: d4420e2f-33bf-ed11-9595-a98758ce176c

Includes   object  optional    
Prices   boolean     

Whether Recreatex should include price data in the response. Example: true

Get article price

Example request:
curl --request GET \
    --get "https://api.pantropica.org/api/v1/recreatex/prices/architecto" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"Criteria\": {
        \"SubscriptionArticleId\": \"430f8d5e-68c2-ed11-9595-a98758ce176c\",
        \"ArticleGroupId\": \"d4420e2f-33bf-ed11-9595-a98758ce176c\",
        \"Includes\": {
            \"Prices\": true
        }
    }
}"
const url = new URL(
    "https://api.pantropica.org/api/v1/recreatex/prices/architecto"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "Criteria": {
        "SubscriptionArticleId": "430f8d5e-68c2-ed11-9595-a98758ce176c",
        "ArticleGroupId": "d4420e2f-33bf-ed11-9595-a98758ce176c",
        "Includes": {
            "Prices": true
        }
    }
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (500):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 30
x-ratelimit-remaining: 27
access-control-allow-origin: *
access-control-allow-methods: GET, POST, PUT, DELETE, OPTIONS
access-control-allow-credentials: true
access-control-max-age: 86400
access-control-allow-headers: Authorization, Content-Type, X-Requested-With
 

{
    "success": false,
    "error": "HTTP request returned status code 500:\n{\"$type\":\"<>f__AnonymousType0`2[[System.Boolean, mscorlib],[System.String, mscorlib]], SyDelSoft.JsonService.Utilities\", (truncated...)\n"
}
 

Request      

GET api/v1/recreatex/prices/{subscriptionArticleId}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

subscriptionArticleId   string     

Example: architecto

Body Parameters

Criteria   object     

The criteria used for the Recreatex subscription article price lookup.

SubscriptionArticleId   string     

The Recreatex subscription article ID. Example: 430f8d5e-68c2-ed11-9595-a98758ce176c

ArticleGroupId   string     

The Recreatex article group ID. Example: d4420e2f-33bf-ed11-9595-a98758ce176c

Includes   object  optional    
Prices   boolean     

Whether Recreatex should include price data in the response. Example: true

Get countries

Example request:
curl --request GET \
    --get "https://api.pantropica.org/api/v1/recreatex/countries" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"SearchCriteria\": {
        \"Paging\": {
            \"PageIndex\": 0,
            \"PageSize\": 9999,
            \"Sorting\": null
        }
    }
}"
const url = new URL(
    "https://api.pantropica.org/api/v1/recreatex/countries"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "SearchCriteria": {
        "Paging": {
            "PageIndex": 0,
            "PageSize": 9999,
            "Sorting": null
        }
    }
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 30
x-ratelimit-remaining: 26
access-control-allow-origin: *
access-control-allow-methods: GET, POST, PUT, DELETE, OPTIONS
access-control-allow-credentials: true
access-control-max-age: 86400
access-control-allow-headers: Authorization, Content-Type, X-Requested-With
 

{
    "NL": "Nederland",
    "BE": "België",
    "DE": "Germany",
    "C": "Canada",
    "DK": "Denmark",
    "FR": "France",
    "IT": "Italy",
    "LU": "Luxembourg",
    "PL": "Poland",
    "UA": "Ukraine",
    "UK": "United Kingdom",
    "US": "United states of America",
    "S": "Zweden",
    "ANDERS": "Anders"
}
 

Request      

GET api/v1/recreatex/countries

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

SearchCriteria   object     

The search criteria used for the Recreatex country lookup.

Paging   object     

The paging settings for the Recreatex country lookup.

PageIndex   integer     

The zero-based page index. Example: 0

PageSize   integer     

The number of countries to request from Recreatex. Example: 9999

Sorting   string  optional    

Optional Recreatex sorting configuration.

Get account by route params

deprecated:Prefer /api/v1/account/{emailAddress}.

Example request:
curl --request GET \
    --get "https://api.pantropica.org/api/v1/recreatex/account/architecto" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"Criteria\": {
        \"Email\": \"email@example.com\",
        \"Includes\": {
            \"Relations\": true
        }
    }
}"
const url = new URL(
    "https://api.pantropica.org/api/v1/recreatex/account/architecto"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "Criteria": {
        "Email": "email@example.com",
        "Includes": {
            "Relations": true
        }
    }
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (422):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 30
x-ratelimit-remaining: 25
access-control-allow-origin: *
access-control-allow-methods: GET, POST, PUT, DELETE, OPTIONS
access-control-allow-credentials: true
access-control-max-age: 86400
access-control-allow-headers: Authorization, Content-Type, X-Requested-With
 

{
    "message": "The given data was invalid.",
    "errors": {
        "email": [
            "No account was found for this email address."
        ]
    }
}
 

Request      

GET api/v1/recreatex/account/{emailAddress}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

emailAddress   string     

Example: architecto

Body Parameters

Criteria   object     

The criteria used for the Recreatex users.

Email   string     

The email address used by the account. Example: email@example.com

Includes   object  optional    
Relations   boolean     

Whether Recreatex should include relations data in the response. Example: true

Get expositions

requires authentication

Example request:
curl --request GET \
    --get "https://api.pantropica.org/api/v1/recreatex/expositions" \
    --header "Authorization: Bearer {FIREBASE_ID_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"SearchCriteria\": {
        \"ExpositionId\": null,
        \"From\": \"2026-09-01\\\\T00:00:00\",
        \"Until\": \"2026-09-01\\\\T23:59:00\",
        \"Includes\": {
            \"Pricing\": false
        },
        \"Paging\": {
            \"PageIndex\": 0,
            \"PageSize\": 99999,
            \"Sorting\": null
        },
        \"ActivePeriods\": true,
        \"IgnoreAvailability\": false
    }
}"
const url = new URL(
    "https://api.pantropica.org/api/v1/recreatex/expositions"
);

const headers = {
    "Authorization": "Bearer {FIREBASE_ID_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "SearchCriteria": {
        "ExpositionId": null,
        "From": "2026-09-01\\T00:00:00",
        "Until": "2026-09-01\\T23:59:00",
        "Includes": {
            "Pricing": false
        },
        "Paging": {
            "PageIndex": 0,
            "PageSize": 99999,
            "Sorting": null
        },
        "ActivePeriods": true,
        "IgnoreAvailability": false
    }
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 30
x-ratelimit-remaining: 23
access-control-allow-origin: *
access-control-allow-methods: GET, POST, PUT, DELETE, OPTIONS
access-control-allow-credentials: true
access-control-max-age: 86400
access-control-allow-headers: Authorization, Content-Type, X-Requested-With
 

{
    "success": false,
    "error": "Invalid or expired token"
}
 

Request      

GET api/v1/recreatex/expositions

Headers

Authorization        

Example: Bearer {FIREBASE_ID_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

SearchCriteria   object     

The search criteria used for the Recreatex exposition lookup.