Introduction
Welcome to our API documentation!
The Rejoose API’s is organized around REST. A RESTful API should use standardized REST-oriented URLs and responses. Rejoose API’s accepts form-encoded request bodies, returns JSON-encoded responses. It also offers authentication, security tokens, and other standard HTTP verbs. These docs provide example API and code to showcase test data. The API’s and their respective docs can subject to change, we will advise in good time, to make you aware of any changes or additions to the API’s. We try to change as little as possible.
To get you started quickly with our API, we recommend providing a list of your most popular devices or product. This will help us ensure a smooth experience by pre-mapping them for your account.
Provide a CSV file: include headers for Brand, Model, Description, and External_ID/Product ID (product manufacturer part number)
Once we have this information, your devices/products will be properly identified and managed within your account, allowing you to take full advantage of the API's features.
The developer who needs to set up the API, will need access to our e/hub where they can generate the relevant API tokens for authentication. Please contact support@rejoose.com for this login. A login for e/hub® (https://e-hub.rejoose.com) requires an agreement with Rejoose.
OBS: You can expand for more detailed information in the API docs. When you see the small black arrow, used for objects such as "⯈ client", or "⯈ devices".
Sandbox mode
When accessing e/hub® (https://e-hub.rejoose.com), you have the option to switch between production and sandbox modes. Sandbox mode allows you to test and explore features without affecting your live data. This mode is ideal for tasks like setting up APIs, testing integrations, and generating reports before going live.
In sandbox mode:
- Data created or modified won't impact your production environment.
- The Life Cycle Assessment (LCA) data mirrors the production environment but is limited to category average values. During your testing phase, you can use the following categories if you want some LCA data returned:
- Server
- Notebook
- Smartphone
- Docking Station
- Monitor
Utilize sandbox mode to ensure your integration is robust and ready for production use.
Rate Limiting
Our API enforces rate limiting to ensure fair usage and prevent abuse. The current rate limit is set to 600 requests/min. The following headers are included in each API response to provide information about your current rate limit status:
-
X-RateLimit-Limit
- This header indicates the maximum number of requests you are permitted to make in a given time window.
- Example:
X-RateLimit-Limit: 100
-
X-RateLimit-Remaining
- This header shows the number of requests remaining in the current rate limit window.
- Example:
X-RateLimit-Remaining: 50
-
Retry-After
- This header is included in the response only when your rate limit has been exceeded. It indicates how many seconds you should wait before making a new request.
-
Example:
Retry-After: 55
-
Response Example
-
When a request exceeds the rate limit, the API will return a
429 Too Many Requests
status code. The response will include theRetry-After
header, as shown below:- HTTP/1.1 429 Too Many Requests
- Content-Type: application/json
- Retry-After: 55
- X-RateLimit-Limit: 100
- X-RateLimit-Remaining: 0
-
Body:
{ "message": "Too Many Attempts." }
-
When a request exceeds the rate limit, the API will return a
Authenticating requests
To authenticate requests, include an Authorization
header with the value "Bearer {YOUR_AUTH_KEY}"
.
All authenticated endpoints are marked with a requires authentication
badge in the documentation below.
You can retrieve your API token by logging into Rejoose e/hub® https://e-hub.rejoose.com and visiting your admin dashboard and clicking "Create API Key".
e.voice
e.voice – environmental invoice
This endpoint is used to generate an e.voice. The e.voice is the counterpart to the well-known financial invoice, and thus you can call the e.voice a carbon invoice. The purpose of the e.voice is to connect the financial transaction with the carbon impact. When utilizing the e.voice API to receive carbon data, you will have multiple options and use cases:
- Successful transaction information (see example response)
- A base64 encoded PDF file (the e.voice document)
- Carbon data for the transaction in total and for all products (raw data format)
Keep in mind that you do not need to save the above data in your ERP system (or similar), as everything is archived for you in the
e.hub and for your customers via e.insights.
Generate e.voice
requires authentication
Example request:
curl --request POST \
"https://app.rejoose.com/api/v3/evoices/generate" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"external_invoice_id\": \"123456789\",
\"external_invoice_date\": \"2023-09-25\",
\"country_code\": \"GB\",
\"supplier_contact\": \"example@rejoose.com\",
\"client\": {
\"name\": \"Eco-Friendly Solutions Ltd\",
\"vat_number\": \"ECOF1234567\",
\"organization_id\": \"EcoFriendly-4987\",
\"address\": \"100 Enviro Way\",
\"address2\": \"Sustainability Lane 3\",
\"zip_code\": \"ECO321\",
\"city\": \"GreenVille\",
\"country\": \"Denmark\",
\"country_code\": \"DK\"
},
\"devices\": [
{
\"external_id\": \"RE8989121\",
\"original_manufacturer_part_number\": \"62B6ASD3EU\",
\"quantity\": 10,
\"category\": \"Notebook\",
\"brand\": \"Lenovo\",
\"model_name\": \"ThinkPad T480\",
\"refurbished\": true,
\"lifetime_months\": 48
}
]
}"
const url = new URL(
"https://app.rejoose.com/api/v3/evoices/generate"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"external_invoice_id": "123456789",
"external_invoice_date": "2023-09-25",
"country_code": "GB",
"supplier_contact": "example@rejoose.com",
"client": {
"name": "Eco-Friendly Solutions Ltd",
"vat_number": "ECOF1234567",
"organization_id": "EcoFriendly-4987",
"address": "100 Enviro Way",
"address2": "Sustainability Lane 3",
"zip_code": "ECO321",
"city": "GreenVille",
"country": "Denmark",
"country_code": "DK"
},
"devices": [
{
"external_id": "RE8989121",
"original_manufacturer_part_number": "62B6ASD3EU",
"quantity": 10,
"category": "Notebook",
"brand": "Lenovo",
"model_name": "ThinkPad T480",
"refurbished": true,
"lifetime_months": 48
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
import requests
import json
url = 'https://app.rejoose.com/api/v3/evoices/generate'
payload = {
"external_invoice_id": "123456789",
"external_invoice_date": "2023-09-25",
"country_code": "GB",
"supplier_contact": "example@rejoose.com",
"client": {
"name": "Eco-Friendly Solutions Ltd",
"vat_number": "ECOF1234567",
"organization_id": "EcoFriendly-4987",
"address": "100 Enviro Way",
"address2": "Sustainability Lane 3",
"zip_code": "ECO321",
"city": "GreenVille",
"country": "Denmark",
"country_code": "DK"
},
"devices": [
{
"external_id": "RE8989121",
"original_manufacturer_part_number": "62B6ASD3EU",
"quantity": 10,
"category": "Notebook",
"brand": "Lenovo",
"model_name": "ThinkPad T480",
"refurbished": true,
"lifetime_months": 48
}
]
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()
Example response (201):
{
"success": true,
"data": {
"external_invoice_id": "123456789",
"external_invoice_date": "2023-09-25",
"country_code": "DK",
"supplier_contact": "example@rejoose.com",
"pdf_base64": "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Ci9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nCj4+CmVuZG9iago5IDAgb2JqCjw8IC9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovTmFtZSAvRjIKL0Jhc2VGb250IC9IZWx2ZXRpY2EtQm9sZAovRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwo+PgplbmRvYmoKMTAgMCBvYmoKPDwgL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9OYW1lIC9GMwovQmFzZUZvbnQgL1RpbWVzLUJvbGQKL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcKPj4KZW5kb2JqCjExIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovQSAxMiAwIFIKL0JvcmRlciBbMCAwIDBdCi9IIC9JCi9SZWN0IFsgMTk5LjEzNzggMTguMjE4NSAzOTYuMTQyMiAyNy4wMTg1IF0KPj4KZW5kb2JqCjEyIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL1VSSQovVVJJIChodHRwczovL3Jlam9vc2UuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDIzLzA2L0V2b2ljZV9FeHBsYWluZXIucGRmKQo+PgplbmRvYmoKeHJlZgowIDEzCjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAwOSAwMDAwMCBuIAowMDAwMDAwMDc0IDAwMDAwIG4gCjAwMDAwMDAxMjAgMDAwMDAgbiAKMDAwMDAwMDI5NSAwMDAwMCBuIAowMDAwMDAwMzI0IDAwMDAwIG4gCjAwMDAwMDA0OTcgMDAwMDAgbiAKMDAwMDAwMDYxOSAwMDAwMCBuIAowMDAwMDAzNTI5IDAwMDAwIG4gCjAwMDAwMDM2MzggMDAwMDAgbiAKMDAwMDAwMzc1MCAwMDAwMCBuIAowMDAwMDAzODU5IDAwMDAwIG4gCjAwMDAwMDM5ODUgMDAwMDAgbiAKdHJhaWxlcgo8PAovU2l6ZSAxMwovUm9vdCAxIDAgUgovSW5mbyA1IDAgUgovSURbPGQ0MjEyYTIwY2E1NTc3NTg1NGNiOWUyNmM3NGRiYjdiPjxkNDIxMmEyMGNhNTU3NzU4NTRjYjllMjZjNzRkYmI3Yj5dCj4+CnN0YXJ0eHJlZgo0MTA0CiUlRU9GCg==",
"carbon_intensity_gram": 123,
"total_kg_co2_eq": 1301.51,
"status": "finalized",
"created_at": "2024-01-05T13:11:49.000000Z",
"client": {
"name": "Eco-Friendly Solutions Ltd",
"vat_number": "ECOF1234567",
"organization_id": "EcoFriendly-4987",
"address": "100 Enviro Way",
"address2": "Sustainability Lane 3",
"zip_code": "ECO321",
"city": "GreenVille",
"country": "Denmark",
"country_code": "DK"
},
"devices": [
{
"external_id": "RE8989121",
"original_manufacturer_part_number": "62B6MAT3EU",
"quantity": 10,
"brand": "Lenovo",
"model_name": "ThinkPad T480",
"category": "Notebook",
"lifetime_months": 72,
"scope_2_kg_co2_eq": 278.41,
"scope_3_kg_co2_eq": 249.27,
"total_kg_co2_eq": 527.68,
"refurbished": true,
"avoided_emissions_kg_co2_eq": 256.68
},
{
"external_id": "SM-S918BZKDEEB",
"original_manufacturer_part_number": null,
"quantity": 10,
"brand": "Samsung",
"model_name": "Galaxy S23 Ultra",
"category": "Smartphone",
"lifetime_months": 30,
"scope_2_kg_co2_eq": 31.18,
"scope_3_kg_co2_eq": 742.65,
"total_kg_co2_eq": 773.83,
"refurbished": false,
"avoided_emissions_kg_co2_eq": 0
}
],
"links": {
"self": "https://app.rejoose.com/api/v3/evoices/123456789"
}
}
}
Example response (422, Validation Error):
{
"errors": {
"external_invoice_id": [
"The external invoice id field is required."
],
"external_invoice_date": [
"The external invoice date field is required."
],
"client.name": [
"The client.name field is required."
]
}
}
Example response (429, Too Many Attempts):
{
"message": "Too Many Attempts."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET e.voice data
requires authentication
Returns the e.voice data
Example request:
curl --request GET \
--get "https://app.rejoose.com/api/v3/evoices/123456789" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.rejoose.com/api/v3/evoices/123456789"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
import requests
import json
url = 'https://app.rejoose.com/api/v3/evoices/123456789'
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()
Example response (200):
{
"success": true,
"data": {
"external_invoice_id": "123456789",
"external_invoice_date": "2023-09-25",
"country_code": "DK",
"supplier_contact": "example@rejoose.com",
"pdf_base64": "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Ci9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nCj4+CmVuZG9iago5IDAgb2JqCjw8IC9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovTmFtZSAvRjIKL0Jhc2VGb250IC9IZWx2ZXRpY2EtQm9sZAovRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwo+PgplbmRvYmoKMTAgMCBvYmoKPDwgL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9OYW1lIC9GMwovQmFzZUZvbnQgL1RpbWVzLUJvbGQKL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcKPj4KZW5kb2JqCjExIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovQSAxMiAwIFIKL0JvcmRlciBbMCAwIDBdCi9IIC9JCi9SZWN0IFsgMTk5LjEzNzggMTguMjE4NSAzOTYuMTQyMiAyNy4wMTg1IF0KPj4KZW5kb2JqCjEyIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL1VSSQovVVJJIChodHRwczovL3Jlam9vc2UuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDIzLzA2L0V2b2ljZV9FeHBsYWluZXIucGRmKQo+PgplbmRvYmoKeHJlZgowIDEzCjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAwOSAwMDAwMCBuIAowMDAwMDAwMDc0IDAwMDAwIG4gCjAwMDAwMDAxMjAgMDAwMDAgbiAKMDAwMDAwMDI5NSAwMDAwMCBuIAowMDAwMDAwMzI0IDAwMDAwIG4gCjAwMDAwMDA0OTcgMDAwMDAgbiAKMDAwMDAwMDYxOSAwMDAwMCBuIAowMDAwMDAzNTI5IDAwMDAwIG4gCjAwMDAwMDM2MzggMDAwMDAgbiAKMDAwMDAwMzc1MCAwMDAwMCBuIAowMDAwMDAzODU5IDAwMDAwIG4gCjAwMDAwMDM5ODUgMDAwMDAgbiAKdHJhaWxlcgo8PAovU2l6ZSAxMwovUm9vdCAxIDAgUgovSW5mbyA1IDAgUgovSURbPGQ0MjEyYTIwY2E1NTc3NTg1NGNiOWUyNmM3NGRiYjdiPjxkNDIxMmEyMGNhNTU3NzU4NTRjYjllMjZjNzRkYmI3Yj5dCj4+CnN0YXJ0eHJlZgo0MTA0CiUlRU9GCg==",
"carbon_intensity_gram": 123,
"total_kg_co2_eq": 1301.51,
"status": "finalized",
"created_at": "2024-01-05T13:11:49.000000Z",
"client": {
"name": "Eco-Friendly Solutions Ltd",
"vat_number": "ECOF1234567",
"organization_id": "EcoFriendly-4987",
"address": "100 Enviro Way",
"address2": "Sustainability Lane 3",
"zip_code": "ECO321",
"city": "GreenVille",
"country": "Denmark",
"country_code": "DK"
},
"devices": [
{
"external_id": "RE8989121",
"original_manufacturer_part_number": "62B6MAT3EU",
"quantity": 10,
"brand": "Lenovo",
"model_name": "ThinkPad T480",
"category": "Notebook",
"lifetime_months": 72,
"scope_2_kg_co2_eq": 278.41,
"scope_3_kg_co2_eq": 249.27,
"total_kg_co2_eq": 527.68,
"refurbished": true,
"avoided_emissions_kg_co2_eq": 256.68
},
{
"external_id": "SM-S918BZKDEEB",
"original_manufacturer_part_number": null,
"quantity": 10,
"brand": "Samsung",
"model_name": "Galaxy S23 Ultra",
"category": "Smartphone",
"lifetime_months": 30,
"scope_2_kg_co2_eq": 31.18,
"scope_3_kg_co2_eq": 742.65,
"total_kg_co2_eq": 773.83,
"refurbished": false,
"avoided_emissions_kg_co2_eq": 0
}
],
"links": {
"self": "https://app.rejoose.com/api/v3/evoices/123456789"
}
}
}
Example response (404):
{
"errors": "Evoice with external_invoice_id 3.1415926535 not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
e.voice - circularity
Provides carbon footprint and avoided emissions data for IT products in the ITAD industry. This API is used when receiving used IT products for refurbishment or selling refurbished products for reuse.
The response includes:
- Avoided emissions from refurbishing the products (kg CO2e).
- Carbon impact of the refurbishment process itself (kg CO2e).
Both datasets are used for customer reporting and internal documentation.
POST e.voice circularity
requires authentication
Generates the e.voice circularity
Example request:
curl --request POST \
"https://app.rejoose.com/api/v3/evoices/circularity/generate" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"external_doc_id\": \"123456789.\",
\"external_doc_date\": \"2023-09-25.\",
\"e_waste_kg\": 10,
\"country_code\": \"GB.\",
\"supplier_contact\": \"example@rejoose.com.\",
\"client\": {
\"name\": \"Eco-Friendly Solutions Ltd\",
\"vat_number\": \"ECOF1234567\",
\"organization_id\": \"EcoFriendly-4987\",
\"address\": \"100 Enviro Way\",
\"address2\": \"Sustainability Lane 3\",
\"zip_code\": \"ECO321\",
\"city\": \"GreenVille\",
\"country\": \"Denmark\",
\"country_code\": \"DK\"
},
\"devices\": [
{
\"external_id\": \"RE8989121\",
\"quantity\": 10,
\"category\": \"Notebook\",
\"brand\": \"Lenovo\",
\"model_name\": \"ThinkPad T480\"
}
]
}"
const url = new URL(
"https://app.rejoose.com/api/v3/evoices/circularity/generate"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"external_doc_id": "123456789.",
"external_doc_date": "2023-09-25.",
"e_waste_kg": 10,
"country_code": "GB.",
"supplier_contact": "example@rejoose.com.",
"client": {
"name": "Eco-Friendly Solutions Ltd",
"vat_number": "ECOF1234567",
"organization_id": "EcoFriendly-4987",
"address": "100 Enviro Way",
"address2": "Sustainability Lane 3",
"zip_code": "ECO321",
"city": "GreenVille",
"country": "Denmark",
"country_code": "DK"
},
"devices": [
{
"external_id": "RE8989121",
"quantity": 10,
"category": "Notebook",
"brand": "Lenovo",
"model_name": "ThinkPad T480"
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
import requests
import json
url = 'https://app.rejoose.com/api/v3/evoices/circularity/generate'
payload = {
"external_doc_id": "123456789.",
"external_doc_date": "2023-09-25.",
"e_waste_kg": 10,
"country_code": "GB.",
"supplier_contact": "example@rejoose.com.",
"client": {
"name": "Eco-Friendly Solutions Ltd",
"vat_number": "ECOF1234567",
"organization_id": "EcoFriendly-4987",
"address": "100 Enviro Way",
"address2": "Sustainability Lane 3",
"zip_code": "ECO321",
"city": "GreenVille",
"country": "Denmark",
"country_code": "DK"
},
"devices": [
{
"external_id": "RE8989121",
"quantity": 10,
"category": "Notebook",
"brand": "Lenovo",
"model_name": "ThinkPad T480"
}
]
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()
Example response (201):
{
"data": {
"id": 31,
"external_doc_id": "ab57e0f1-2396-430c-ba5a-339d77fda792",
"external_doc_date": "2024-01-22",
"country_code": "DK",
"e_waste_kg_co2_eq": 212.81,
"refurbishment_impact_kg_co2_eq": 180.42866,
"refurbishment_offset_kg_co2_eq": 3053.34679,
"client": {
"name": "Rejoose ApS",
"organization_id": "rejoose_aps",
"vat_number": "39121506",
"address": "Finsensvej 78",
"address2": "Finsensvej 78",
"zip_code": "2000",
"city": "Frederiksberg",
"country": "Denmark",
"country_code": "DK"
},
"devices": [
{
"external_id": "X220-DEHO",
"amount": 5,
"brand": "LENOVO",
"model_name": "Lenovo X220",
"category": "Laptop",
"refurbishment_impact_percentage": 0.0516,
"refurbishment_impact_kg_co2_eq": 75.08832,
"refurbishment_offset_kg_co2_eq": 1380.11168
},
{
"external_id": "X3T23AV",
"amount": 2,
"brand": "HP",
"model_name": "HP EliteBook 820 G4",
"category": "Notebook",
"refurbishment_impact_percentage": 0.0516,
"refurbishment_impact_kg_co2_eq": 105.34034,
"refurbishment_offset_kg_co2_eq": 1673.23511
}
],
"created_at": "2024-01-24T11:33:10.000000Z",
"links": {
"self": "https://app.rejoose.com/api/v3/evoices/circularity/ab57e0f1-2396-430c-ba5a-339d77fda792",
"pdf": "https://app.rejoose.com/api/v3/evoices/circularity/ab57e0f1-2396-430c-ba5a-339d77fda792/pdf",
"base_64_pdf": "https://app.rejoose.com/api/v3/evoices/circularity/ab57e0f1-2396-430c-ba5a-339d77fda792/pdf?base64=1"
}
},
"errors": null
}
Example response (422, Validation Error):
{
"data": null,
"errors": {
"external_doc_id": [
"The external doc id field is required."
],
"external_doc_date": [
"The external doc date field is required."
],
"client.name": [
"The client.name field is required."
]
}
}
Example response (429, Too Many Attempts):
{
"message": "Too Many Attempts."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET e.voices circularity PDF
requires authentication
Returns the e.voice circularity PDF
Example request:
curl --request GET \
--get "https://app.rejoose.com/api/v3/evoices/circularity/ab57e0f1-2396-430c-ba5a-339d77fda792/pdf" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/pdf"
const url = new URL(
"https://app.rejoose.com/api/v3/evoices/circularity/ab57e0f1-2396-430c-ba5a-339d77fda792/pdf"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/pdf",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
import requests
import json
url = 'https://app.rejoose.com/api/v3/evoices/circularity/ab57e0f1-2396-430c-ba5a-339d77fda792/pdf'
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/pdf'
}
response = requests.request('GET', url, headers=headers)
response.json()
Example response (200):
application/pdf The PDF file
Example response (404):
{
"data": null,
"errors": {
"not_found": [
"Evoice Circularity with external document id 1 not found for your partner"
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET e.voice circularity data
requires authentication
Returns the e.voice circularity data
Example request:
curl --request GET \
--get "https://app.rejoose.com/api/v3/evoices/circularity/ab57e0f1-2396-430c-ba5a-339d77fda792" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.rejoose.com/api/v3/evoices/circularity/ab57e0f1-2396-430c-ba5a-339d77fda792"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
import requests
import json
url = 'https://app.rejoose.com/api/v3/evoices/circularity/ab57e0f1-2396-430c-ba5a-339d77fda792'
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()
Example response (200):
{
"data": {
"id": 31,
"external_doc_id": "ab57e0f1-2396-430c-ba5a-339d77fda792",
"external_doc_date": "2024-01-22",
"country_code": "DK",
"e_waste_kg_co2_eq": 212.81,
"refurbishment_impact_kg_co2_eq": 180.42866,
"refurbishment_offset_kg_co2_eq": 3053.34679,
"client": {
"name": "Rejoose ApS",
"organization_id": "rejoose_aps",
"vat_number": "39121506",
"address": "Finsensvej 78",
"address2": "Finsensvej 78",
"zip_code": "2000",
"city": "Frederiksberg",
"country": "Denmark",
"country_code": "DK"
},
"devices": [
{
"external_id": "X220-DEHO",
"amount": 5,
"brand": "LENOVO",
"model_name": "Lenovo X220",
"category": "Laptop",
"refurbishment_impact_percentage": 0.0516,
"refurbishment_impact_kg_co2_eq": 75.08832,
"refurbishment_offset_kg_co2_eq": 1380.11168
},
{
"external_id": "X3T23AV",
"amount": 2,
"brand": "HP",
"model_name": "HP EliteBook 820 G4",
"category": "Notebook",
"refurbishment_impact_percentage": 0.0516,
"refurbishment_impact_kg_co2_eq": 105.34034,
"refurbishment_offset_kg_co2_eq": 1673.23511
}
],
"created_at": "2024-01-24T11:33:10.000000Z",
"links": {
"self": "https://app.rejoose.com/api/v3/evoices/circularity/ab57e0f1-2396-430c-ba5a-339d77fda792",
"pdf": "https://app.rejoose.com/api/v3/evoices/circularity/ab57e0f1-2396-430c-ba5a-339d77fda792/pdf",
"base_64_pdf": "https://app.rejoose.com/api/v3/evoices/circularity/ab57e0f1-2396-430c-ba5a-339d77fda792/pdf?base64=1"
}
},
"errors": null
}
Example response (404):
{
"data": null,
"errors": {
"not_found": [
"Evoice Circularity with external document id 1 not found for your partner"
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
e.product
This endpoint retrieves the carbon footprint of products, typically used in e-commerce settings, quotations, and other contexts where a general carbon footprint assessment is sufficient. For more detailed reporting on a per-customer basis, consider using the e.voice API. Both solutions complement each other: e.product is ideal for pre-sales, while e.voice is suited for post-sales.
The carbon footprint is returned using the product's manufacturer part number (MPN), brand, category, and country code.
This API returns the following information:
- Total carbon footprint (LCA): 33.3 kg CO2e (for a new product)
- Refurbishment impact (LCA): 3.5 kg CO2e (for a refurbished product)
- Avoided emissions by choosing refurbished: 28.0 kg CO2e
GET e.product
requires authentication
The GET endpoint returns the carbon footprint data of a single product.
Example request:
curl --request GET \
--get "https://app.rejoose.com/api/v3/products?manufacture_part_number=286H8AA&brand=HP+Inc&category=Docking+station&country_code=DK&refurbished=1" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.rejoose.com/api/v3/products"
);
const params = {
"manufacture_part_number": "286H8AA",
"brand": "HP Inc",
"category": "Docking station",
"country_code": "DK",
"refurbished": "1",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
import requests
import json
url = 'https://app.rejoose.com/api/v3/products'
params = {
'manufacture_part_number': '286H8AA',
'brand': 'HP Inc',
'category': 'Docking station',
'country_code': 'DK',
'refurbished': '1',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()
Example response (200, NOTE: refurbishment_impact_kg_co2_eq and refurbishment_offset_kg_co2_eq will only be included when product is refurbished):
{
"data": {
"manufacture_part_number": "286H8AA",
"brand": "HP Inc",
"category": "Docking station",
"country_code": "DK",
"refurbished": true,
"data_match": true,
"data_method": "CA",
"total_kg_co2_eq": 33.32004288,
"carbon_intensity_gram": 123.42,
"lifetime_month": 48,
"refurbishment_impact_kg_co2_eq": 3.457734144,
"refurbishment_offset_kg_co2_eq": 28.03242874
},
"errors": null
}
Example response (200, NOTE: Requires 'e.product-plus' to retrieve detailed LCA (Life Cycle Assessment) data.):
{
"data": {
"manufacture_part_number": "286H8AA",
"brand": "HP Inc",
"category": "Docking station",
"country_code": "DK",
"refurbished": false,
"data_match": true,
"data_method": "CA",
"total_kg_co2_eq": 40.23551117,
"manufacturing_kg_co2_eq": 29.86230874,
"transportation_kg_co2_eq": 5.457734144,
"use_kg_co2_eq": 3.457734144,
"end_of_life_kg_co2_eq": 1.457734144,
"carbon_intensity_gram": 123.42,
"lifetime_month": 48,
"refurbishment_impact_kg_co2_eq": null,
"refurbishment_offset_kg_co2_eq": null
},
"errors": null
}
Example response (200, NOTE: The carbon data will be null when no product was found):
{
"data": {
"manufacture_part_number": "286H8AA",
"brand": "HP Inc",
"category": "Docking station",
"country_code": "DK",
"refurbished": true,
"data_match": false,
"data_method": null,
"total_kg_co2_eq": null,
"carbon_intensity_gram": null,
"lifetime_month": null,
"refurbishment_impact_kg_co2_eq": null,
"refurbishment_offset_kg_co2_eq": null
},
"errors": null
}
Example response (422):
{
"data": null,
"errors": {
"manufacture_part_number": [
"The manufacture part number field is required."
],
"brand": [
"The brand field is required."
],
"category": [
"The category field is required."
],
"refurbished": [
"The refurbished field must not be greater than 1."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST e.product
requires authentication
The POST endpoint returns the carbon footprint data of multiple products.
Example request:
curl --request POST \
"https://app.rejoose.com/api/v3/products" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"products\": [
{
\"manufacture_part_number\": \"officia\",
\"brand\": \"HP Inc\",
\"category\": \"Docking station\",
\"country_code\": \"DK\",
\"refurbished\": true
}
]
}"
const url = new URL(
"https://app.rejoose.com/api/v3/products"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"products": [
{
"manufacture_part_number": "officia",
"brand": "HP Inc",
"category": "Docking station",
"country_code": "DK",
"refurbished": true
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());
import requests
import json
url = 'https://app.rejoose.com/api/v3/products'
payload = {
"products": [
{
"manufacture_part_number": "officia",
"brand": "HP Inc",
"category": "Docking station",
"country_code": "DK",
"refurbished": true
}
]
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()
Example response (200, Note: refurbishment_impact_kg_co2_eq and refurbishment_offset_kg_co2_eq will only be included when product is refurbished):
{
"data": [
{
"manufacture_part_number": "286H8AA",
"brand": "HP Inc",
"category": "Docking station",
"country_code": "DK",
"refurbished": true,
"data_match": true,
"data_method": "CA+",
"total_kg_co2_eq": 3.7941664000000004,
"carbon_intensity_gram": 103,
"lifetime_month": 48,
"refurbishment_impact_kg_co2_eq": 0.3267312,
"refurbishment_offset_kg_co2_eq": 6.0052688
}
],
"errors": null
}
Example response (200, NOTE: Requires 'e.product-plus' to retrieve detailed LCA (Life Cycle Assessment) data.):
{
"data": [
{
"manufacture_part_number": "286H8AA",
"brand": "HP Inc",
"category": "Docking station",
"country_code": "DK",
"refurbished": false,
"data_match": true,
"data_method": "CA",
"total_kg_co2_eq": 40.23551117,
"manufacturing_kg_co2_eq": 29.86230874,
"transportation_kg_co2_eq": 5.457734144,
"use_kg_co2_eq": 3.457734144,
"end_of_life_kg_co2_eq": 1.457734144,
"carbon_intensity_gram": 123.42,
"lifetime_month": 48,
"refurbishment_impact_kg_co2_eq": null,
"refurbishment_offset_kg_co2_eq": null
}
],
"errors": null
}
Example response (200, Note: The carbon footprint data will be null when the product was not found.):
{
"data": [
{
"manufacture_part_number": "286H8AA",
"brand": "HP Inc",
"category": "Docking station",
"country_code": "DK",
"refurbished": true,
"data_match": false,
"data_method": null,
"total_kg_co2_eq": null,
"carbon_intensity_gram": null,
"lifetime_month": null,
"refurbishment_impact_kg_co2_eq": null,
"refurbishment_offset_kg_co2_eq": null
}
],
"errors": null
}
Example response (422):
{
"data": null,
"errors": {
"products.0.manufacture_part_number": [
"The products.0.manufacture_part_number field is required."
],
"products.0.brand": [
"The products.0.brand field is required."
],
"products.0.category": [
"The products.0.category field is required."
],
"products.0.country_code": [
"The products.0.country_code field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET changed products
requires authentication
Retrieve changed products as a CSV file.
This endpoint provides a CSV file listing the changes for a specified date or week.
The file contains columns for manufacturer_part_number
, brand
, and category
.
Use this file to check for relevant products and brands, then use the e.product
API to obtain detailed information.
If a date
is specified, a daily changes file for that date is returned, provided the date is not in the future.
Without a date
, a summary file for the specified or most recent week is retrieved.
Response Details:
- Returns a 302 Redirect to the CDN URL if the file is accessible there.
Example request:
curl --request GET \
--get "https://app.rejoose.com/api/v3/products/changes?date=2024-11-01&week_number=45" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"
const url = new URL(
"https://app.rejoose.com/api/v3/products/changes"
);
const params = {
"date": "2024-11-01",
"week_number": "45",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());
import requests
import json
url = 'https://app.rejoose.com/api/v3/products/changes'
params = {
'date': '2024-11-01',
'week_number': '45',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()
Example response (302):
manufacturer_part_number,brand,category
UT04CBE,Lenovo,Notebook
RE242EP,HP,Notebook
PSMA2E-00U01DGC,Toshiba,Notebook
RH324ET#ABY-D30,HP,Notebook
A3HF-5A027P,ASUS,Notebook
Example response (404):
{
"error": "File not found"
}
Example response (404):
Show headers
cache-control: no-cache, private
content-type: application/json
{
"message": "The route localhost/api/v3/products/changes could not be found."
}
Example response (422):
{
"error": "Invalid week number. The week number should be no higher than last week"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.