API Reference
Complete reference for the Natakahii REST API. All endpoints accept and return JSON. This page also documents the Firebase Google sign-in exchange and the cargo webhook flow that keeps ecommerce orders synchronized with Natakahii Cargo.
Authentication — Endpoints marked with a red AUTH chip require a valid JWT token.
Include it as Authorization: Bearer <token> in every authenticated request.
Media Storage — All uploaded files (images, videos, logos) are stored in Backblaze B2 cloud storage and served via CDN.
File URLs in responses use the format https://cdn.natakahii.com/path/file.ext.
How It Works
Firebase Google Sign-In
The frontend authenticates the customer with Firebase Google Auth.
Firebase returns an ID token to the frontend.
The frontend sends that token to /api/v1/auth/google.
Natakahii verifies the Firebase token, links or creates the user, and returns the regular Natakahii JWT.
How It Works
Marketplace to Cargo Fulfillment
The customer checks out with delivery_method=natakahii_cargo and shipping details.
The order stays pending until the payment webhook marks it as paid.
Natakahii splits the paid order by vendor and sends dropoff requests to the cargo system.
Cargo reports receiving, QC, shipment, and delivery events back to /api/v1/integrations/cargo/events.
Natakahii updates order cargo statuses automatically and creates refunds when QC fails.
Authentication
Endpoints for email/password authentication, Firebase Google sign-in, token management, and password recovery.
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
name
string
Yes
max:255
Full name of the user.
email
string
Yes
email|unique:users
Valid email address. Must be unique.
password
string
Yes
min:8|mixed_case|numbers
Password with uppercase, lowercase and numbers.
phone
string
Optional
max:20
Phone number (optional).
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/register" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"name" : "John Doe" ,
"email" : "[email protected] " ,
"password" : "SecurePass123" ,
"phone" : "+255700000000"
}'
200 Success
422 Validation failed
200 OK
{
"message" : "Registration initiated. Please check your email for OTP verification." ,
"email" : "[email protected] "
}
422
Validation failed
{
"message" : "The email has already been taken." ,
"errors" : {
"email" : [
"The email has already been taken."
]
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
email
string
Yes
email
Email used during registration.
otp
string
Yes
size:6
Six-digit OTP code received via email.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/verify-registration" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"email" : "[email protected] " ,
"otp" : "123456"
}'
201 Success
400 Invalid or expired OTP
404 Registration data expired
201 OK
{
"message" : "Registration successful." ,
"user" : {
"id" : 1 ,
"name" : "John Doe" ,
"email" : "[email protected] "
} ,
"token" : "eyJ0eXAiOiJKV1QiLCJhbGc..." ,
"token_type" : "bearer" ,
"expires_in" : 3600
}
400
Invalid or expired OTP
{
"message" : "Invalid or expired OTP."
}
404
Registration data expired
{
"message" : "Registration data not found or expired. Please register again."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
email
string
Yes
email
Registered email address.
password
string
Yes
—
Account password.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/login" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"email" : "[email protected] " ,
"password" : "SecurePass123"
}'
200 Success
401 Invalid credentials
403 Account blocked
200 OK
{
"message" : "Login successful." ,
"user" : {
"id" : 1 ,
"name" : "John Doe" ,
"email" : "[email protected] "
} ,
"token" : "eyJ0eXAiOiJKV1QiLCJhbGc..." ,
"token_type" : "bearer" ,
"expires_in" : 3600
}
401
Invalid credentials
{
"message" : "Invalid email or password."
}
403
Account blocked
{
"message" : "Your account has been blocked. Please contact support."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
id_token
string
Yes
—
Firebase ID token returned by the frontend after Google sign-in with Firebase Auth.
The frontend signs the user in with Firebase Google Auth and reads the Firebase ID token.
Send that Firebase ID token to this endpoint instead of a Google access token or profile payload.
Natakahii verifies the Firebase token, links or creates a customer account, and returns the platform JWT for authenticated API calls.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/google" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"id_token" : "FIREBASE_ID_TOKEN"
}'
200 Success
401 Invalid Firebase token
403 Account blocked
409 Email linked to another Google account
422 Verified email required
503 Server-side Google sign-in unavailable
200 OK
{
"message" : "Login successful." ,
"user" : {
"id" : 1 ,
"name" : "Jane Customer" ,
"email" : "[email protected] " ,
"profile_photo" : "https://lh3.googleusercontent.com/a/sample-photo" ,
"status" : "active" ,
"roles" : [
{
"id" : 1 ,
"name" : "customer"
}
]
} ,
"token" : "eyJ0eXAiOiJKV1QiLCJhbGc..." ,
"token_type" : "bearer" ,
"expires_in" : 3600
}
401
Invalid Firebase token
{
"message" : "Invalid Google sign-in token."
}
403
Account blocked
{
"message" : "Your account has been blocked. Please contact support."
}
409
Email linked to another Google account
{
"message" : "This email is already linked to another Google account."
}
422
Verified email required
{
"message" : "A verified Google email address is required."
}
503
Server-side Google sign-in unavailable
{
"message" : "Google sign-in is temporarily unavailable on the server."
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/logout" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
401 Unauthenticated
200 OK
{
"message" : "Successfully logged out."
}
401
Unauthenticated
{
"message" : "Unauthenticated."
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/refresh" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
401 Unauthenticated
200 OK
{
"token" : "eyJ0eXAiOiJKV1QiLCJhbGc..." ,
"token_type" : "bearer" ,
"expires_in" : 3600
}
401
Unauthenticated
{
"message" : "Unauthenticated."
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/auth/me" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
401 Unauthenticated
200 OK
{
"user" : {
"id" : 1 ,
"name" : "John Doe" ,
"email" : "[email protected] " ,
"phone" : "+1234567890" ,
"profile_photo" : "https://cdn.natakahii.com/users/avatars/abc123.jpg" ,
"status" : "active" ,
"roles" : [
{
"id" : 1 ,
"name" : "customer"
}
]
}
}
401
Unauthenticated
{
"message" : "Unauthenticated."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
email
string
Yes
email|exists:users
Registered email address.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/forgot-password" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"email" : "[email protected] "
}'
200 Success
422 Validation failed
200 OK
{
"message" : "Password reset OTP sent to your email."
}
422
Validation failed
{
"message" : "The selected email is invalid." ,
"errors" : {
"email" : [
"The selected email is invalid."
]
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
email
string
Yes
email|exists:users
Registered email address.
otp
string
Yes
size:6
Six-digit OTP code from email.
password
string
Yes
min:8|mixed_case|numbers|confirmed
New password.
password_confirmation
string
Yes
—
Must match password field.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/reset-password" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"email" : "[email protected] " ,
"otp" : "123456" ,
"password" : "SecurePass123" ,
"password_confirmation" : "SecurePass123"
}'
200 Success
400 Invalid or expired OTP
200 OK
{
"message" : "Password reset successful. You can now login with your new password."
}
400
Invalid or expired OTP
{
"message" : "Invalid or expired OTP."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
email
string
Yes
email
Email to resend OTP to.
type
string
Yes
in:registration,password_reset,email_verification
OTP purpose type.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/resend-otp" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"email" : "[email protected] " ,
"type" : "value"
}'
200 Success
429 Too many requests
200 OK
{
"message" : "OTP resent successfully."
}
429
Too many requests
{
"message" : "Please wait before requesting a new OTP."
}
User Profile
Manage the authenticated user's profile and profile photo. Photos are stored in Backblaze B2 and served via CDN.
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/vendor-application/status" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
401 Unauthenticated
200 OK
{
"status" : "pending" ,
"application" : {
"id" : 1 ,
"business_name" : "My Store" ,
"status" : "pending" ,
"submitted_at" : "2026-02-08T10: 00 : 00 Z"
}
}
401
Unauthenticated
{
"message" : "Unauthenticated."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
business_name
string
Yes
max:255
Business/shop name.
business_description
string
Yes
—
Description of the business.
business_address
string
Yes
—
Business physical address.
business_phone
string
Yes
max:20
Business contact phone.
business_email
string
Yes
email
Business contact email.
tax_id
string
Optional
max:50
Tax ID number (optional).
documents
array
Optional
—
Array of document file uploads.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/vendor-application" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"business_name" : "John Doe" ,
"business_description" : "value" ,
"business_address" : "Mlimani City" ,
"business_phone" : "+255700000000" ,
"business_email" : "[email protected] " ,
"tax_id" : "value" ,
"documents" : []
}'
201 Success
422 Validation failed
201 OK
{
"message" : "Vendor application submitted successfully." ,
"application" : {
"id" : 1 ,
"business_name" : "My Store" ,
"status" : "pending"
}
}
422
Validation failed
{
"message" : "The business name field is required."
}
PATCH
Request Body
application/json
Parameter
Type
Required
Rules
Description
name
string
Optional
max:255
Updated display name.
phone
string
Optional
max:20
Updated phone number.
curl -X PATCH \
"https://up.openjournaltheme.com/api/v1/profile" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"name" : "John Doe" ,
"phone" : "+255700000000"
}'
200 Success
401 Unauthenticated
200 OK
{
"message" : "Profile updated." ,
"user" : {
"id" : 1 ,
"name" : "John Doe" ,
"email" : "[email protected] " ,
"phone" : "+255700000000" ,
"profile_photo" : "https://cdn.natakahii.com/users/avatars/abc123.jpg" ,
"status" : "active" ,
"roles" : [
"customer"
]
}
}
401
Unauthenticated
{
"message" : "Unauthenticated."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
photo
file
Yes
image|max:5120
Profile photo image (max 5MB). Accepts JPEG, PNG, GIF, WebP.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/profile/photo" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "photo=@/path/to/photo.jpg"
200 Success
422 Validation failed
200 OK
{
"message" : "Profile photo updated." ,
"user" : {
"id" : 1 ,
"name" : "John Doe" ,
"profile_photo" : "https://cdn.natakahii.com/users/avatars/abc123.jpg"
}
}
422
Validation failed
{
"message" : "The photo field must be an image." ,
"errors" : {
"photo" : [
"The photo field must be an image."
]
}
}
DELETE
curl -X DELETE \
"https://up.openjournaltheme.com/api/v1/profile/photo" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
401 Unauthenticated
200 OK
{
"message" : "Profile photo removed." ,
"user" : {
"id" : 1 ,
"name" : "John Doe" ,
"profile_photo" : null
}
}
401
Unauthenticated
{
"message" : "Unauthenticated."
}
Catalog
Public product catalog browsing. No authentication required.
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/categories" \
-H "Content-Type: application/json" \
-H "Accept: application/json"
200 Success
200 OK
{
"categories" : [
{
"id" : 1 ,
"name" : "Electronics" ,
"slug" : "electronics" ,
"children" : [
{
"id" : 2 ,
"name" : "Phones"
}
] ,
"products_count" : 45
}
]
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/categories/{category}/filters" \
-H "Content-Type: application/json" \
-H "Accept: application/json"
200 Success
404 Category not found
200 OK
{
"category" : {
"id" : 1 ,
"name" : "Electronics"
} ,
"filters" : [
{
"id" : 1 ,
"name" : "Color" ,
"values" : [
{
"id" : 1 ,
"value" : "Red"
}
]
}
]
}
404
Category not found
{
"message" : "Not found."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
category_id
integer
Optional
—
Filter by category.
vendor_id
integer
Optional
—
Filter by vendor.
search
string
Optional
—
Search by name or description.
min_price
number
Optional
—
Minimum price filter.
max_price
number
Optional
—
Maximum price filter.
sort_by
string
Optional
in:created_at,price,name
Sort field. Default: created_at.
sort_dir
string
Optional
in:asc,desc
Sort direction. Default: desc.
per_page
integer
Optional
—
Items per page. Default: 15.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/products" \
-H "Content-Type: application/json" \
-H "Accept: application/json"
200 Success
200 OK
{
"products" : [
{
"id" : 1 ,
"name" : "Wireless Earbuds" ,
"price" : "29999.00" ,
"image" : "https://cdn.natakahii.com/products/1/earbuds.jpg" ,
"vendor" : {
"shop_name" : "TechShop" ,
"logo" : "https://cdn.natakahii.com/vendors/logos/techshop.png"
}
}
] ,
"meta" : {
"current_page" : 1 ,
"last_page" : 5 ,
"per_page" : 15 ,
"total" : 68
}
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/products/{product}" \
-H "Content-Type: application/json" \
-H "Accept: application/json"
200 Success
404 Product not found
200 OK
{
"product" : {
"id" : 1 ,
"name" : "Wireless Earbuds" ,
"price" : "29999.00" ,
"images" : [
"https://cdn.natakahii.com/products/1/earbuds.jpg"
] ,
"variants" : [ ] ,
"reviews_count" : 12 ,
"reviews_avg_rating" : "4.50"
} ,
"recent_reviews" : [ ]
}
404
Product not found
{
"message" : "Not found."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
attribute_value_ids
string
Yes
—
Comma-separated attribute value IDs.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/products/{product}/variants/resolve?attribute_value_ids=1,4,7" \
-H "Content-Type: application/json" \
-H "Accept: application/json"
200 Success
404 No matching variant
200 OK
{
"variant" : {
"id" : 1 ,
"sku" : "WE-BLK-M" ,
"price" : "29999.00" ,
"stock" : 50
}
}
404
No matching variant
{
"message" : "No matching variant found for the selected attributes."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
search
string
Optional
—
Search by shop name or description.
per_page
integer
Optional
—
Items per page. Default: 15.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/vendors" \
-H "Content-Type: application/json" \
-H "Accept: application/json"
200 Success
200 OK
{
"vendors" : [
{
"id" : 1 ,
"shop_name" : "TechShop" ,
"logo" : "https://cdn.natakahii.com/vendors/logos/techshop.png" ,
"products_count" : 45
}
] ,
"meta" : {
"current_page" : 1 ,
"last_page" : 2 ,
"per_page" : 15 ,
"total" : 20
}
}
Vendor
Vendor store management. Requires authentication and vendor role.
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
shop_name
string
Yes
max:255
Store display name.
shop_slug
string
Yes
alpha_dash|unique:vendors
URL-friendly store slug.
description
string
Optional
—
Store description.
logo
file
Optional
image|max:2048
Store logo image.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/vendor/profile" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "shop_name=value" \
-F "shop_slug=value" \
-F "description=value" \
-F "logo=@/path/to/logo.jpg"
201 Success
422 Validation failed
201 OK
{
"message" : "Vendor profile created. Awaiting approval." ,
"vendor" : {
"id" : 1 ,
"shop_name" : "My Store" ,
"logo" : "https://cdn.natakahii.com/vendors/logos/my-store.png" ,
"status" : "pending"
}
}
422
Validation failed
{
"message" : "The shop slug has already been taken."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
category_id
integer
Yes
exists:categories,id
Product category.
name
string
Yes
max:255
Product name.
description
string
Optional
—
Product description.
price
number
Yes
numeric|min:0
Base price.
discount_price
number
Optional
numeric|min:0
Discounted price.
stock
integer
Yes
integer|min:0
Available stock.
images[]
file
Optional
image|max:2048
Product images (multiple).
variants
array
Optional
—
Array of variant objects with sku, price, stock, attributes.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/vendor/products" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "category_id=1" \
-F "name=value" \
-F "description=value" \
-F "price=100.00" \
-F "discount_price=100.00" \
-F "stock=1" \
-F "images[]=@/path/to/images.jpg" \
-F "variants=[]"
201 Success
403 Vendor not approved
201 OK
{
"message" : "Product created successfully." ,
"product" : {
"id" : 1 ,
"name" : "Wireless Earbuds" ,
"slug" : "wireless-earbuds-abc123" ,
"images" : [
"https://cdn.natakahii.com/products/1/earbuds-1.jpg",
"https://cdn.natakahii.com/products/1/earbuds-2.jpg"
]
}
}
403
Vendor not approved
{
"message" : "Your vendor account must be approved before listing products."
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/vendor/dropoffs" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
404 No vendor profile
200 OK
{
"dropoffs" : [
{
"id" : 1 ,
"status" : "pending" ,
"order_id" : 10
}
]
}
404
No vendor profile
{
"message" : "No vendor profile found."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
order_id
integer
Yes
exists:orders,id
Order to drop off.
fulfillment_center_id
integer
Yes
exists:fulfillment_centers,id
Target fulfillment center.
notes
string
Optional
—
Additional notes.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/vendor/dropoffs" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"order_id" : 1,
"fulfillment_center_id" : 1,
"notes" : "value"
}'
201 Success
404 No vendor profile
201 OK
{
"message" : "Dropoff registered." ,
"dropoff" : {
"id" : 1 ,
"status" : "pending"
}
}
404
No vendor profile
{
"message" : "No vendor profile found."
}
Cart, Wishlist & Alerts
Shopping cart management, wishlists and price/stock alerts. Requires authentication.
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/cart" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
401 Unauthenticated
200 OK
{
"cart" : {
"id" : 1 ,
"items" : [
{
"id" : 1 ,
"product_id" : 5 ,
"quantity" : 2 ,
"price" : "29999.00"
}
]
}
}
401
Unauthenticated
{
"message" : "Unauthenticated."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
product_id
integer
Yes
exists:products,id
Product to add.
quantity
integer
Yes
min:1
Quantity to add.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/cart/items" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"product_id" : 1,
"quantity" : 1
}'
200 Success
422 Validation failed
200 OK
{
"message" : "Item added to cart." ,
"cart" : {
"id" : 1 ,
"items" : [ ]
}
}
422
Validation failed
{
"message" : "The selected product id is invalid."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
per_page
integer
Optional
—
Items per page.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/wishlists" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"wishlists" : [
{
"id" : 1 ,
"product_id" : 5 ,
"product" : {
"name" : "Earbuds" ,
"image" : "https://cdn.natakahii.com/products/5/earbuds.jpg"
}
}
] ,
"meta" : {
"total" : 3
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
product_id
integer
Yes
exists:products,id
Product to toggle.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/wishlists/toggle" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"product_id" : 1
}'
201 Success
201 OK
{
"message" : "Product added to wishlist." ,
"wishlisted" : true
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
product_id
integer
Yes
exists:products,id
Product to watch.
type
string
Yes
in:price_drop,back_in_stock
Alert type.
target_price
number
Optional
required_if:type,price_drop
Target price for price_drop alerts.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/alerts" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"product_id" : 1,
"type" : "value" ,
"target_price" : 100
}'
201 Success
201 OK
{
"message" : "Alert created." ,
"alert" : {
"id" : 1 ,
"type" : "price_drop" ,
"target_price" : "20000.00"
}
}
Checkout & Payments
Convert carts to orders, process payments, request shipping quotes, and trigger Natakahii Cargo fulfillment after successful payment.
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
delivery_method
string
Optional
max:50
Delivery option chosen by the customer. Use `natakahii_cargo` for marketplace-to-cargo fulfillment.
shipping_provider
string
Optional
max:100
Shipping provider label. Usually filled automatically from a selected quote.
shipping_service_level
string
Optional
max:50
Requested service level such as `standard` or `express`.
shipping_amount
number
Optional
min:0
Quoted shipping amount if you are not passing `shipping_quote_id`.
shipping_currency
string
Optional
size:3
Currency code for shipping charges, such as `TZS`.
shipping_contact_name
string
Optional
required when delivery_method=natakahii_cargo|max:255
Recipient contact name. Required for Natakahii Cargo orders.
shipping_contact_phone
string
Optional
required when delivery_method=natakahii_cargo|max:30
Recipient phone number. Required for Natakahii Cargo orders.
shipping_address
string
Optional
required when delivery_method=natakahii_cargo
Delivery street or address details. Required for Natakahii Cargo orders.
shipping_city
string
Optional
required when delivery_method=natakahii_cargo|max:100
Destination city. Required for Natakahii Cargo orders.
shipping_region
string
Optional
max:100
Destination region/state if available.
pickup_center_code
string
Optional
max:50
Preferred Natakahii Cargo office or fulfillment center code for vendor dropoff intake.
shipping_quote_id
integer
Optional
exists:shipping_quotes,id
Previously selected shipping quote to bind to this order.
Optionally request shipping quotes first, then pass `shipping_quote_id` at checkout to lock the quote into the order.
When `delivery_method` is `natakahii_cargo`, include recipient contact and destination details so cargo can fulfill the shipment after payment.
The order is created in `pending` payment state. Natakahii Cargo orders are stored with `cargo_fulfillment_status=awaiting_payment` and `cargo_sync_status=pending` until payment succeeds.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/checkout" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"delivery_method" : "natakahii_cargo" ,
"shipping_provider" : "NatakaHii Cargo" ,
"shipping_service_level" : "standard" ,
"shipping_amount" : 100,
"shipping_currency" : "TZS" ,
"shipping_contact_name" : "John Doe" ,
"shipping_contact_phone" : "+255700000000" ,
"shipping_address" : "Mlimani City" ,
"shipping_city" : "Dar es Salaam" ,
"shipping_region" : "Dar es Salaam" ,
"pickup_center_code" : "DSM-CARGO-01" ,
"shipping_quote_id" : 1
}'
201 Success
422 Empty cart
422 Selected quote not found
422 Selected quote expired
201 OK
{
"message" : "Order placed successfully." ,
"order" : {
"id" : 1 ,
"order_number" : "NTK-20260208-ABC123" ,
"total_amount" : "59998.00" ,
"status" : "pending" ,
"payment_status" : "pending" ,
"delivery_method" : "natakahii_cargo" ,
"shipping_provider" : "NatakaHii Cargo" ,
"shipping_amount" : "5000.00" ,
"cargo_fulfillment_status" : "awaiting_payment" ,
"cargo_sync_status" : "pending"
}
}
422
Empty cart
{
"message" : "Your cart is empty."
}
422
Selected quote not found
{
"message" : "Selected shipping quote was not found."
}
422
Selected quote expired
{
"message" : "Selected shipping quote has expired."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
order_id
integer
Yes
exists:orders,id
Order to pay for.
payment_method
string
Yes
in:mpesa,card,bank_transfer
Payment method.
Call this endpoint after checkout to create the pending payment record.
Complete the payment through the provider flow in your frontend or provider UI.
Once the payment webhook reports success, Natakahii marks the order as paid and automatically sends Natakahii Cargo orders to the cargo system vendor by vendor.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/payments" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"order_id" : 1,
"payment_method" : "value"
}'
201 Success
422 Already paid
201 OK
{
"message" : "Payment initiated. Complete payment using the provided details." ,
"payment" : {
"id" : 1 ,
"amount" : "59998.00" ,
"status" : "pending"
}
}
422
Already paid
{
"message" : "This order has already been paid."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
transaction_id
string
Yes
—
Provider transaction ID.
status
string
Yes
—
Payment status from the provider. `success` and `completed` are treated as paid.
The payment provider signs the raw webhook body and sends the signature in `X-Webhook-Signature`.
Natakahii maps provider statuses into local payment states and updates the related order.
If the order uses `natakahii_cargo`, a successful payment triggers creation and syncing of vendor-specific cargo dropoff requests.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/payments/webhook/{provider}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "X-Webhook-Signature: HMAC_SHA256(raw_body, provider_webhook_secret)" \
-d '{
"transaction_id" : "TXN-12345" ,
"status" : "success"
}'
200 Success
400 Invalid payload
401 Invalid webhook signature
404 Payment not found
200 OK
{
"message" : "Webhook processed."
}
400
Invalid payload
{
"message" : "Invalid webhook payload."
}
401
Invalid webhook signature
{
"message" : "Invalid webhook signature."
}
404
Payment not found
{
"message" : "Payment not found."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
destination_address
string
Yes
—
Delivery destination address.
weight_kg
number
Yes
min:0.1
Total weight in kilograms.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/shipping/quotes" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"destination_address" : "Mlimani City" ,
"weight_kg" : 100
}'
200 Success
200 OK
{
"message" : "Shipping quotes generated." ,
"quotes" : [
{
"provider" : "NatakaHii Cargo" ,
"service_level" : "standard" ,
"price" : "5000.00" ,
"estimated_days" : 5
}
]
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/shipping/quotes/{quote}/select" \
-H "Content-Type: application/json" \
-H "Accept: application/json"
200 Success
422 Quote expired
200 OK
{
"message" : "Shipping quote selected."
}
422
Quote expired
{
"message" : "This quote has expired. Please request new quotes."
}
Social Commerce
Social engagement features: likes, shares, follows, views, and not-interested markers.
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/products/{product}/view" \
-H "Content-Type: application/json" \
-H "Accept: application/json"
200 Success
200 OK
{
"message" : "View recorded."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
platform
string
Optional
max:50
Share platform (e.g. whatsapp, facebook).
curl -X POST \
"https://up.openjournaltheme.com/api/v1/products/{product}/shares" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"platform" : "value"
}'
200 Success
200 OK
{
"message" : "Share recorded." ,
"shares_count" : 15
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/products/{product}/likes" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"message" : "Product liked." ,
"likes_count" : 42
}
DELETE
curl -X DELETE \
"https://up.openjournaltheme.com/api/v1/products/{product}/likes" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"message" : "Product unliked." ,
"likes_count" : 41
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/vendors/{vendor}/follow" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"message" : "Now following TechShop." ,
"followers_count" : 150
}
DELETE
curl -X DELETE \
"https://up.openjournaltheme.com/api/v1/vendors/{vendor}/follow" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"message" : "Unfollowed TechShop." ,
"followers_count" : 149
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/me/following/vendors" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"vendors" : [
{
"id" : 1 ,
"shop_name" : "TechShop"
}
] ,
"meta" : {
"total" : 5
}
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/products/{product}/not-interested" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"message" : "Product marked as not interested."
}
Cargo & Shipping
Fulfillment centers, dropoff management, cargo shipments, delivery runs, and tracking for both standalone cargo work and marketplace-originated Natakahii Cargo orders.
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/cargo/fulfillment-centers" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"fulfillment_centers" : [
{
"id" : 1 ,
"name" : "Dar es Salaam Hub" ,
"city" : "Dar es Salaam"
}
]
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
in:pending,received,qc_in_progress,qc_passed,qc_failed
Filter by dropoff status.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/cargo/dropoffs" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"dropoffs" : [
{
"id" : 1 ,
"status" : "pending" ,
"order_id" : 10 ,
"vendor" : {
"shop_name" : "TechShop"
}
}
] ,
"meta" : {
"total" : 25
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
fulfillment_center_id
integer
Yes
exists:fulfillment_centers,id
Receiving center.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/cargo/dropoffs/{dropoff}/receive" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"fulfillment_center_id" : 1
}'
200 Success
200 OK
{
"message" : "Dropoff received." ,
"dropoff" : {
"status" : "received"
}
}
PATCH
Request Body
application/json
Parameter
Type
Required
Rules
Description
items
array
Yes
—
Array of items with product_id and quantity.
curl -X PATCH \
"https://up.openjournaltheme.com/api/v1/cargo/dropoffs/{dropoff}/items" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"items" : []
}'
200 Success
422 Invalid items
200 OK
{
"message" : "Dropoff items updated." ,
"dropoff" : {
"id" : 1 ,
"items" : [ ]
}
}
422
Invalid items
{
"message" : "Invalid item data provided."
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/cargo/dropoffs/{dropoff}/qc/start" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"message" : "QC started." ,
"dropoff" : {
"status" : "qc_in_progress"
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
passed
boolean
Yes
—
Whether QC passed.
notes
string
Optional
—
QC notes.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/cargo/dropoffs/{dropoff}/qc/complete" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"passed" : true,
"notes" : "value"
}'
200 Success
200 OK
{
"message" : "QC completed." ,
"dropoff" : {
"status" : "qc_passed"
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
order_id
integer
Yes
exists:orders,id
Order to ship.
destination_address
string
Yes
—
Delivery address.
recipient_name
string
Yes
max:255
Recipient name.
recipient_phone
string
Optional
max:20
Recipient phone.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/cargo/shipments" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"order_id" : 1,
"destination_address" : "Mlimani City" ,
"recipient_name" : "John Doe" ,
"recipient_phone" : "+255700000000"
}'
201 Success
201 OK
{
"message" : "Shipment created." ,
"shipment" : {
"tracking_number" : "NTK-SHP-ABC123" ,
"status" : "pending"
}
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/shipments/{shipment}/tracking" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"shipment" : {
"tracking_number" : "NTK-SHP-ABC123" ,
"status" : "in_transit"
} ,
"tracking_events" : [
{
"event" : "shipped" ,
"location" : "Dar es Salaam"
}
]
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/cargo/shipments/{shipment}/mark-delivered" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"message" : "Shipment marked as delivered."
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/cargo/my/delivery-runs" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"delivery_runs" : [
{
"id" : 1 ,
"status" : "dispatched" ,
"scheduled_date" : "2026-02-10"
}
]
}
Integrations
Internal webhook and system-to-system endpoints that keep Natakahii synchronized with external services such as Natakahii Cargo.
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
event
string
Yes
max:100
Cargo event name. Supported values include `dropoff.received`, `dropoff.qc_passed`, `dropoff.qc_failed`, `shipment.created`, and `shipment.delivered`.
data.external_order_id
integer
Yes
—
Natakahii order ID stored in cargo as the external order reference.
data.external_vendor_id
integer
Optional
—
Vendor ID for vendor-specific dropoff updates.
data.cargo_dropoff_id
string
Optional
—
Cargo-side dropoff identifier.
data.cargo_shipment_id
string
Optional
—
Cargo-side shipment identifier, when available.
data.tracking_number
string
Optional
—
Tracking number assigned by Natakahii Cargo.
data.status
string
Optional
—
Cargo status label supplied by the sender.
data.notes
string
Optional
—
Operational notes such as QC results or delivery comments.
Natakahii Cargo signs the raw JSON body with the shared cargo webhook secret and sends the signature in `X-Cargo-Signature`.
Natakahii resolves the local order and vendor dropoff using the external IDs in the webhook payload.
Order-level cargo statuses are recalculated from the vendor dropoff states after each event.
When QC fails, Natakahii automatically creates refund payment records for the affected vendor items, and refunds shipping if the whole order fails.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/integrations/cargo/events" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "X-Cargo-Signature: HMAC_SHA256(raw_body, CARGO_WEBHOOK_SECRET)" \
-d '{
"event" : "dropoff.received" ,
"data" : {
"external_order_id" : 1,
"external_vendor_id" : 1,
"cargo_dropoff_id" : "value" ,
"cargo_shipment_id" : "value" ,
"tracking_number" : "NTK-SHP-ABC123" ,
"status" : "success" ,
"notes" : "value"
}
}'
200 Success
401 Invalid cargo webhook signature
404 Order not found
422 Validation failed
200 OK
{
"message" : "Cargo event processed." ,
"order_id" : 12
}
401
Invalid cargo webhook signature
{
"message" : "Invalid cargo webhook signature."
}
404
Order not found
{
"message" : "No query results for model [ App\\Models\\Order] 12"
}
422
Validation failed
{
"message" : "The data.external order id field is required."
}
Messaging & Disputes
User-to-user messaging and order dispute management.
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
receiver_id
integer
Yes
exists:users,id
User to message.
subject
string
Optional
max:255
Conversation subject.
message
string
Yes
—
First message content.
order_id
integer
Optional
exists:orders,id
Related order (optional).
curl -X POST \
"https://up.openjournaltheme.com/api/v1/messages/conversations" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"receiver_id" : 1,
"subject" : "value" ,
"message" : "value" ,
"order_id" : 1
}'
201 Success
201 OK
{
"message" : "Conversation started." ,
"conversation" : {
"id" : 1 ,
"subject" : "Order question"
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
order_id
integer
Yes
exists:orders,id
Order to dispute.
reason
string
Yes
max:255
Dispute reason.
description
string
Yes
—
Detailed description of the issue.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/disputes" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"order_id" : 1,
"reason" : "value" ,
"description" : "value"
}'
201 Success
422 Active dispute exists
201 OK
{
"message" : "Dispute filed." ,
"dispute" : {
"id" : 1 ,
"status" : "open" ,
"reason" : "Wrong item received"
}
}
422
Active dispute exists
{
"message" : "An active dispute already exists for this order."
}
Analytics & Notifications
Vendor analytics dashboard and user notifications.
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/analytics/vendor/overview" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
404 No vendor profile
200 OK
{
"analytics" : {
"total_products" : 25 ,
"active_products" : 20 ,
"total_orders" : 150 ,
"total_revenue" : 450000
}
}
404
No vendor profile
{
"message" : "No vendor profile found."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
per_page
integer
Optional
—
Items per page.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/notifications" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"notifications" : [ ] ,
"unread_count" : 3 ,
"meta" : {
"total" : 15
}
}
Admin
Administrative endpoints for platform management. Requires admin role.
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/dashboard" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
403 Forbidden
200 OK
{
"message" : "Dashboard statistics retrieved." ,
"data" : {
"total_users" : 150 ,
"active_users" : 142 ,
"total_vendors" : 25 ,
"total_products" : 340 ,
"total_orders" : 1200 ,
"total_revenue" : 58750
}
}
403
Forbidden
{
"message" : "Forbidden. Admin access required."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
in:active,blocked
Filter by status.
role
string
Optional
—
Filter by role name.
search
string
Optional
—
Search by name or email.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/users" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"message" : "Users retrieved." ,
"data" : {
"data" : [
{
"id" : 1 ,
"name" : "John Doe" ,
"status" : "active"
}
] ,
"total" : 150
}
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/users/{user}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
404 User not found
200 OK
{
"user" : {
"id" : 1 ,
"name" : "John Doe" ,
"email" : "[email protected] " ,
"status" : "active" ,
"roles" : [
"customer",
"vendor"
]
}
}
404
User not found
{
"message" : "User not found."
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/roles" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"roles" : [
{
"id" : 1 ,
"name" : "customer"
} ,
{
"id" : 2 ,
"name" : "vendor"
} ,
{
"id" : 3 ,
"name" : "admin"
}
]
}
PATCH
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Yes
in:active,blocked
New status.
curl -X PATCH \
"https://up.openjournaltheme.com/api/v1/admin/users/{user}/status" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"status" : "success"
}'
200 Success
403 Cannot change own status
200 OK
{
"message" : "User status updated to blocked."
}
403
Cannot change own status
{
"message" : "You cannot change your own status."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
role
string
Yes
exists:roles,name
Role name.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/users/{user}/assign-role" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"role" : "value"
}'
200 Success
200 OK
{
"message" : "Role 'vendor' assigned to John Doe."
}
DELETE
Request Body
application/json
Parameter
Type
Required
Rules
Description
role
string
Yes
exists:roles,name
Role name to revoke.
curl -X DELETE \
"https://up.openjournaltheme.com/api/v1/admin/users/{user}/revoke-role" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
403 Cannot revoke own admin role
200 OK
{
"message" : "Role 'vendor' revoked from John Doe."
}
403
Cannot revoke own admin role
{
"message" : "You cannot revoke your own admin role."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
—
Filter by vendor status.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/vendors" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"vendors" : [
{
"id" : 1 ,
"shop_name" : "TechShop" ,
"logo" : "https://cdn.natakahii.com/vendors/logos/techshop.png" ,
"status" : "approved"
}
] ,
"meta" : {
"total" : 25
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Yes
in:approved,suspended
New vendor status.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/vendors/{vendor}/verification/review" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"status" : "success"
}'
200 Success
200 OK
{
"message" : "Vendor approved."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
in:pending,approved,rejected
Filter by application status.
search
string
Optional
—
Search by business name or applicant name.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/vendor-applications" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"applications" : [
{
"id" : 1 ,
"business_name" : "My Store" ,
"status" : "pending" ,
"user" : {
"name" : "John Doe"
}
}
] ,
"meta" : {
"total" : 10
}
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/vendor-applications/{application}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
404 Application not found
200 OK
{
"application" : {
"id" : 1 ,
"business_name" : "My Store" ,
"business_description" : "We sell electronics" ,
"status" : "pending" ,
"documents" : [ ]
}
}
404
Application not found
{
"message" : "Application not found."
}
PATCH
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Yes
in:approved,rejected
New status.
notes
string
Optional
—
Admin notes about the decision.
curl -X PATCH \
"https://up.openjournaltheme.com/api/v1/admin/vendor-applications/{application}/status" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"status" : "success" ,
"notes" : "value"
}'
200 Success
422 Invalid status transition
200 OK
{
"message" : "Application approved. Vendor account created." ,
"application" : {
"id" : 1 ,
"status" : "approved"
}
}
422
Invalid status transition
{
"message" : "Cannot change status of processed application."
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/categories" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"categories" : [
{
"id" : 1 ,
"name" : "Electronics" ,
"slug" : "electronics" ,
"is_active" : true ,
"sort_order" : 1 ,
"children" : [ ] ,
"products_count" : 45
}
]
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
name
string
Yes
max:255
Category name.
slug
string
Optional
max:255|unique:categories
URL-friendly slug (auto-generated if not provided).
parent_id
integer
Optional
exists:categories,id
Parent category ID for subcategories.
is_active
boolean
Optional
—
Active status. Default: true.
sort_order
integer
Optional
min:0
Display order. Auto-assigned if not provided.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/categories" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"name" : "John Doe" ,
"slug" : "value" ,
"parent_id" : 1,
"is_active" : true,
"sort_order" : 1
}'
201 Success
422 Validation failed
201 OK
{
"message" : "Category created successfully" ,
"category" : {
"id" : 1 ,
"name" : "Electronics" ,
"slug" : "electronics" ,
"is_active" : true ,
"sort_order" : 1
}
}
422
Validation failed
{
"message" : "The name field is required." ,
"errors" : {
"name" : [
"The name field is required."
]
}
}
PATCH
Request Body
application/json
Parameter
Type
Required
Rules
Description
name
string
Optional
max:255
Updated category name.
slug
string
Optional
max:255|unique:categories
Updated slug.
parent_id
integer
Optional
exists:categories,id
Updated parent category.
is_active
boolean
Optional
—
Updated active status.
sort_order
integer
Optional
min:0
Updated sort order.
curl -X PATCH \
"https://up.openjournaltheme.com/api/v1/admin/categories/{category}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"name" : "John Doe" ,
"slug" : "value" ,
"parent_id" : 1,
"is_active" : true,
"sort_order" : 1
}'
200 Success
404 Category not found
200 OK
{
"message" : "Category updated successfully" ,
"category" : {
"id" : 1 ,
"name" : "Electronics & Gadgets" ,
"slug" : "electronics-gadgets"
}
}
404
Category not found
{
"message" : "Not found."
}
DELETE
curl -X DELETE \
"https://up.openjournaltheme.com/api/v1/admin/categories/{category}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
422 Cannot delete
404 Category not found
200 OK
{
"message" : "Category deleted successfully"
}
422
Cannot delete
{
"message" : "Cannot delete category with existing products"
}
404
Category not found
{
"message" : "Not found."
}
PATCH
curl -X PATCH \
"https://up.openjournaltheme.com/api/v1/admin/categories/{category}/toggle-status" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
404 Category not found
200 OK
{
"message" : "Category status updated successfully" ,
"category" : {
"id" : 1 ,
"is_active" : false
}
}
404
Category not found
{
"message" : "Not found."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
—
Filter by product status.
vendor_id
integer
Optional
—
Filter by vendor.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/products" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"products" : [ ] ,
"meta" : {
"total" : 340
}
}
PATCH
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Yes
in:active,draft,out_of_stock
New product status.
curl -X PATCH \
"https://up.openjournaltheme.com/api/v1/admin/products/{product}/moderation" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"status" : "success"
}'
200 Success
200 OK
{
"message" : "Product status changed to active."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
—
Filter by order status.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/orders" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"orders" : [ ] ,
"meta" : {
"total" : 1200
}
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
—
Filter by payment status.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/payments" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"payments" : [ ] ,
"meta" : {
"total" : 980
}
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/escrow/orders/{order}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
404 Order not found
200 OK
{
"order" : {
"id" : 1 ,
"order_number" : "NTK-20260208-ABC123"
} ,
"escrow" : {
"amount" : "59998.00" ,
"status" : "held" ,
"held_since" : "2026-02-08T10: 00 : 00 Z"
}
}
404
Order not found
{
"message" : "Order not found."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
—
Filter by shipment status.
tracking_number
string
Optional
—
Search by tracking number.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/shipments" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"shipments" : [
{
"id" : 1 ,
"tracking_number" : "NTK-SHP-ABC123" ,
"status" : "in_transit"
}
] ,
"meta" : {
"total" : 50
}
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/cargo/shipments/{shipment}/inspections" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
404 Shipment not found
200 OK
{
"inspections" : [
{
"id" : 1 ,
"status" : "passed" ,
"inspected_at" : "2026-02-08T12: 00 : 00 Z" ,
"notes" : "All items verified"
}
]
}
404
Shipment not found
{
"message" : "Shipment not found."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
order_id
integer
Yes
exists:orders,id
Order to refund.
amount
number
Yes
min:0.01
Refund amount.
reason
string
Yes
—
Refund reason.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/refunds" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"order_id" : 1,
"amount" : 100,
"reason" : "value"
}'
201 Success
201 OK
{
"message" : "Refund processed."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Yes
in:resolved,rejected
Resolution status.
resolution
string
Yes
—
Resolution description.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/disputes/{dispute}/resolve" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"status" : "success" ,
"resolution" : "value"
}'
200 Success
200 OK
{
"message" : "Dispute resolved."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
delivery_agent_id
integer
Yes
exists:users,id
Assigned delivery agent.
scheduled_date
string
Yes
date
Scheduled delivery date (Y-m-d).
vehicle_info
string
Optional
max:255
Vehicle information.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/delivery-runs" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"delivery_agent_id" : 1,
"scheduled_date" : "value" ,
"vehicle_info" : "value"
}'
201 Success
201 OK
{
"message" : "Delivery run created." ,
"delivery_run" : {
"id" : 1 ,
"status" : "scheduled"
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
shipment_ids
array
Yes
—
Array of shipment IDs to assign.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/delivery-runs/{run}/shipments" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"shipment_ids" : []
}'
200 Success
422 Invalid shipments
200 OK
{
"message" : "Shipments assigned to delivery run." ,
"assigned_count" : 3
}
422
Invalid shipments
{
"message" : "Some shipments are not available for assignment."
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/delivery-runs/{run}/dispatch" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
422 Already dispatched
200 OK
{
"message" : "Delivery run dispatched." ,
"delivery_run" : {
"id" : 1 ,
"status" : "dispatched"
}
}
422
Already dispatched
{
"message" : "Delivery run is already dispatched."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
in:open,pending,resolved,closed
Filter by ticket status.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/support/tickets" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"tickets" : [
{
"id" : 1 ,
"subject" : "Order Issue" ,
"status" : "open"
}
] ,
"meta" : {
"total" : 25
}
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/analytics/overview" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"analytics" : {
"users" : 150 ,
"vendors" : 20 ,
"products" : 340 ,
"orders_total" : 1200 ,
"revenue_total" : 58750
}
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
in:open,resolved,rejected
Filter by dispute status.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/disputes" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"disputes" : [
{
"id" : 1 ,
"status" : "open" ,
"reason" : "Wrong item"
}
] ,
"meta" : {
"total" : 10
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
action
string
Yes
in:warn,suspend,remove,ignore
Action to take on the report.
notes
string
Optional
—
Admin notes about the action.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/reports/{report}/action" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"action" : "value" ,
"notes" : "value"
}'
200 Success
404 Report not found
200 OK
{
"message" : "Report action taken." ,
"action" : "warn"
}
404
Report not found
{
"message" : "Report not found."
}
Super Admin
Super admin only endpoints. Manage admin accounts, settings, fees, plans, and audit logs.
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/super/admins" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
403 Super admin required
403
Super admin required
{
"message" : "Forbidden. Super admin access required."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
name
string
Yes
max:255
Admin name.
email
string
Yes
email|unique:users
Admin email.
password
string
Yes
min:8
Admin password.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/super/admins" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"name" : "John Doe" ,
"email" : "[email protected] " ,
"password" : "SecurePass123"
}'
201 Success
201 OK
{
"message" : "Admin account created." ,
"admin" : {
"id" : 2 ,
"name" : "New Admin"
}
}
PATCH
Request Body
application/json
Parameter
Type
Required
Rules
Description
name
string
Optional
max:255
Updated admin name.
email
string
Optional
email|unique:users
Updated admin email.
password
string
Optional
min:8
New password (if changing).
curl -X PATCH \
"https://up.openjournaltheme.com/api/v1/admin/super/admins/{user}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"name" : "John Doe" ,
"email" : "[email protected] " ,
"password" : "SecurePass123"
}'
200 Success
404 Admin not found
200 OK
{
"message" : "Admin account updated." ,
"admin" : {
"id" : 2 ,
"name" : "Updated Name"
}
}
404
Admin not found
{
"message" : "Admin not found."
}
DELETE
curl -X DELETE \
"https://up.openjournaltheme.com/api/v1/admin/super/admins/{user}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
403 Cannot delete self
200 OK
{
"message" : "Admin account deleted."
}
403
Cannot delete self
{
"message" : "Cannot delete your own account."
}
PUT
Request Body
application/json
Parameter
Type
Required
Rules
Description
settings
array
Yes
—
Array of {key, value, group} objects.
curl -X PUT \
"https://up.openjournaltheme.com/api/v1/admin/super/settings" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"settings" : []
}'
200 Success
200 OK
{
"message" : "Settings updated."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
name
string
Yes
max:255
Plan name.
price
number
Yes
min:0
Plan price.
billing_cycle
string
Yes
in:monthly,yearly
Billing cycle.
features
array
Optional
—
Array of feature strings.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/super/subscription-plans" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"name" : "John Doe" ,
"price" : 100,
"billing_cycle" : "value" ,
"features" : []
}'
201 Success
201 OK
{
"message" : "Subscription plan created." ,
"plan" : {
"name" : "Premium" ,
"price" : "50000.00"
}
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
action
string
Optional
—
Filter by action type.
user_id
integer
Optional
—
Filter by user.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/super/audit-logs" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"audit_logs" : [
{
"id" : 1 ,
"action" : "user.blocked" ,
"user" : {
"name" : "Admin"
}
}
] ,
"meta" : {
"total" : 500
}
}