Create Subscription
curl --request POST \
--url https://api.nozle.app/engine/api/v1/subscribe \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"customer_id": "<string>",
"plan_code": "<string>"
}
'import requests
url = "https://api.nozle.app/engine/api/v1/subscribe"
payload = {
"customer_id": "<string>",
"plan_code": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({customer_id: '<string>', plan_code: '<string>'})
};
fetch('https://api.nozle.app/engine/api/v1/subscribe', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.nozle.app/engine/api/v1/subscribe"
payload := strings.NewReader("{\n \"customer_id\": \"<string>\",\n \"plan_code\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}require 'uri'
require 'net/http'
url = URI("https://api.nozle.app/engine/api/v1/subscribe")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"customer_id\": \"<string>\",\n \"plan_code\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.nozle.app/engine/api/v1/subscribe",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'customer_id' => '<string>',
'plan_code' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.post("https://api.nozle.app/engine/api/v1/subscribe")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"customer_id\": \"<string>\",\n \"plan_code\": \"<string>\"\n}")
.asString();{
"subscription_id": "<string>",
"status": "<string>"
}Checkout & Subscriptions
Create Subscription
POST
/
engine
/
api
/
v1
/
subscribe
Create Subscription
curl --request POST \
--url https://api.nozle.app/engine/api/v1/subscribe \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"customer_id": "<string>",
"plan_code": "<string>"
}
'import requests
url = "https://api.nozle.app/engine/api/v1/subscribe"
payload = {
"customer_id": "<string>",
"plan_code": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({customer_id: '<string>', plan_code: '<string>'})
};
fetch('https://api.nozle.app/engine/api/v1/subscribe', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.nozle.app/engine/api/v1/subscribe"
payload := strings.NewReader("{\n \"customer_id\": \"<string>\",\n \"plan_code\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}require 'uri'
require 'net/http'
url = URI("https://api.nozle.app/engine/api/v1/subscribe")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"customer_id\": \"<string>\",\n \"plan_code\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.nozle.app/engine/api/v1/subscribe",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'customer_id' => '<string>',
'plan_code' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.post("https://api.nozle.app/engine/api/v1/subscribe")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"customer_id\": \"<string>\",\n \"plan_code\": \"<string>\"\n}")
.asString();{
"subscription_id": "<string>",
"status": "<string>"
}Base URL:
The response also carries Core’s full
https://api.nozle.app/engine/api/v1.
Create a subscription directly without going through a checkout flow. Use this for server-side subscription creation where you handle payment collection separately.
Auth: sk_ (secret key) only.
string
required
External customer ID. The customer must already exist: create it first with Create Customer. An unknown ID returns
404 and creates nothing.string
required
The plan code to subscribe the customer to (e.g.
pro).Response
string
required
The subscription’s external ID,
sub-<customer_id>-<plan_code>. Use it in later subscription calls.string
required
Subscription status (e.g.
active).subscription object, with the plan, billing period and entitlements.
Errors
| Status | Code | Meaning |
|---|---|---|
400 | plan_code or customer_id is missing. | |
404 | customer_not_found | No customer has this customer_id. Create it with POST /customers, then call subscribe again. No subscription is created. |
404 | plan_not_found | No plan has this plan_code. |
502 | The customer could not be verified; retry. |
Subscription ID and repeat calls
The subscription external ID is alwayssub-<customer_id>-<plan_code>. Calling subscribe again with the same customer and plan returns 200 with the same subscription and creates no second one. Subscribing the same customer to a different plan creates a second active subscription next to the first; it does not replace it. Use Upgrade to change plans.