Introduction
The OnePort BPaaS (Booking Platform as a Service) API lets partner platforms onboard their customers to OnePort 365 and raise, price and track freight requests on their behalf.
OnePort 365 is a digital freight forwarding platform connecting shippers, exporters and importers to carriers, freight agents and logistics providers across Africa and global trade lanes. BPaaS is a thin layer over the OnePort 365 API: every request is passed to OnePort, and OnePort's answer comes back unchanged. BPaaS stores no customer data of its own.
With v2 your platform can:
- Onboard customers and their companies in one call, with no email verification step.
- Raise RFQs for ocean freight (FCL and LCL), air freight, haulage and customs brokerage.
- Search and select ocean freight rates before sending an RFQ to OnePort.
- Follow booked shipments and file documents against them.
- Look up reference data: airports and HS-code commodities.
Base URL
Prefix every endpoint path in these docs with the base URL for your environment.
| Environment | Base URL |
|---|---|
| Test / Staging | https://test-bpass-api.oneport365.com/api/v1 |
| Production | https://bpass-api.oneport365.com/api/v1 |
Authentication
v2 uses two credentials. Which one a request needs is shown next to each endpoint.
| Credential | Header | Used on |
|---|---|---|
| x-api-key Your partner key |
x-api-key: op365_… | Register, Login, Refresh token and the three Password recovery calls. You make these as the partner, on your customer's behalf. |
| Bearer token The customer's session |
Authorization: Bearer <accessToken> | Everything else. Each request acts as the signed-in customer and only sees their company's data. |
Your partner key is issued by OnePort. BPaaS does not store it: it passes the key to OnePort, which checks it.
Calls that need the key answer 401 without it.
Customer sessions
Login returns an accessToken (valid 24 hours)
and a refreshToken (valid 7 days, single use). When the access token expires, call
Refresh token for a new pair.
Getting Started
1. Register customer (x-api-key; password emailed to the customer)
↓
2. Login (x-api-key → accessToken, refreshToken)
↓
3. Upload RFQ documents (optional: packing list, proforma invoice)
↓
4. Create RFQ (status: incomplete)
↓
5. Search rates → Select rate (ocean freight only)
↓
6. Confirm RFQ (status: new rfq; sent to OnePort Sales)
↓
7. OnePort books it → appears under Shipments
↓
8. Upload shipment documents
Use Reference data at any point to look up airport codes and HS-code commodities for the RFQ.
Requests & Responses
Request bodies are JSON (Content-Type: application/json) with snake_case
fields. The only exception is refreshToken, a BPaaS field. Document uploads use
multipart/form-data. OnePort validates every body and its status codes and messages are
returned unchanged.
{
"success": true,
"message": "Optional human-readable message",
"data": { … }
}
{
"success": false,
"message": "What went wrong"
}
Calls that only change state (logout, password changes, deactivation) answer 204 with no body.
Pagination
List endpoints take page (from 1) and limit, and return the rows in data.data with paging details alongside:
{
"data": [ … ],
"total": 42,
"page": 1,
"limit": 10,
"total_pages": 5,
"has_prev_page": false,
"has_next_page": true,
"prev_page": 0,
"next_page": 2
}
Errors & Rate Limits
| Status | Meaning |
|---|---|
| 400 | Validation failed. message names the field or rule. |
| 401 | Missing or invalid partner key on an auth call, or a missing, invalid or expired Bearer token. |
| 403 | The customer's account is suspended or deactivated, or their company was deleted. On auth calls: your partner account is suspended or the call came from an IP outside your allowlist. |
| 404 | The record doesn't exist or belongs to another company. |
| 429 | Rate limited. See below. |
OnePort limits each customer email address to:
- 10 failed sign-ins per 15 minutes
- 5 emailed codes per hour (signup and password recovery)
BPaaS also limits requests per client IP. Past any of these limits the API answers 429.
Health Check
Served at the server root, outside /api/v1: https://test-bpass-api.oneport365.com/health.
{
"status": "OK",
"message": "Server is running"
}
Migrating from v1
v1 is deprecated and will be retired soon. Its docs are still available from the version switch at the top of the page. The main changes:
| Area | v1 | v2 |
|---|---|---|
| Base path | /api | /api/v1 |
| Signup | Register, then verify an emailed OTP | Register with your partner key; no OTP. The password is emailed to the customer. |
| Sessions | One Bearer token; log in again when it expires | Access token (24 h) plus single-use refresh token (7 days) |
| Password reset | Email + OTP + new password in one call | Request code → verify code → reset with reset_token |
| Rates & bookings | Live Rates (search_id) and Bookings | RFQs: create, search rates, select, confirm |
| Shipments | Created by the client | Read-only list and detail; created when OnePort books an RFQ |
| Documents | shipment_file, document_name, document_type | file, document_category, document_type keys from Document categories |
| Reference data | /daas/commodity-types | /reference/commodities, /reference/airports |
Auth
Create a customer, sign them in and keep their session alive. These calls are made by you, the partner, on the customer's behalf, so they carry your partner key.
Register customer
Creates the customer and their company on OnePort in one step, recorded against your partner account. No email verification code is needed: as a partner you vouch for the customer's email address.
Returns 201. OnePort emails the customer a password; it is never returned in the response. Sign them in next with Login.
Body
| Field | Type | Description | |
|---|---|---|---|
| firstname | string | required | |
| lastname | string | required | |
| string | required | The customer's email. Must be an inbox they can read: their password is sent here. | |
| phone | string | required | International format, e.g. +2348012345678 |
| title | string | required | Job title |
| company.name | string | required | Must not match an existing company name exactly |
| company.email | string | required | |
| company.industry | string | required | |
| company.address | string | optional |
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/register' \
--header 'x-api-key: $PARTNER_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"firstname": "Grace",
"lastname": "Okafor",
"email": "[email protected]",
"phone": "+2348012345678",
"title": "Procurement Manager",
"company": {
"name": "ABC Ltd",
"email": "[email protected]",
"industry": "Logistics",
"address": "12 Marina, Lagos"
}
}'{
"firstname": "Grace",
"lastname": "Okafor",
"email": "[email protected]",
"phone": "+2348012345678",
"title": "Procurement Manager",
"company": {
"name": "ABC Ltd",
"email": "[email protected]",
"industry": "Logistics",
"address": "12 Marina, Lagos"
}
}{
"success": true,
"message": "Account created. The customer's password has been sent to their email.",
"data": {
"user": {
"id": "6ad04a57c1abf3e526d845d7",
"created_at": "2026-10-15T03:36:55.825Z",
"updated_at": "2026-10-15T03:36:55.825Z",
"firstname": "grace",
"lastname": "okafor",
"email": "[email protected]",
"phone": "+2348012345678",
"status": "active",
"role": "admin",
"company_id": "6ad04a57c1abf3e526d845d5",
"title": "procurement manager",
"is_first_login": 0,
"partner_id": "6ad04994b5accb5031a052c6"
},
"company": {
"id": "6ad04a57c1abf3e526d845d5",
"name": "bpaas docs test co mv8zm7rw"
}
}
}{
"success": false,
"message": "An account with this email already exists. Log in, reset your password, or contact support."
}{
"success": false,
"message": "The title field is required."
}{
"success": false,
"message": "Partner API key required. Send it in the x-api-key header."
}{
"success": false,
"message": "Invalid API key"
}Errors
| Status | When |
|---|---|
| 400 | A field is invalid or missing, the email is already registered, or a company with exactly this name exists. |
| 401 | x-api-key is missing, unknown, revoked or expired. |
| 403 | Your partner account is suspended, or the call came from an IP outside your allowlist. |
Login
Signs the customer in and returns their user, company and tokens. Send tokens.accessToken as a Bearer token on every customer request; keep tokens.refreshToken to renew the session.
user.is_first_login is 0 on the customer's first sign-in. Prompt them to replace the emailed password with Change password.Body
| Field | Type | Description | |
|---|---|---|---|
| string | required | ||
| password | string | required | The emailed password, or the one the customer has since set |
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/login' \
--header 'x-api-key: $PARTNER_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"email": "[email protected]",
"password": "PASTE_PASSWORD_FROM_EMAIL"
}'{
"email": "[email protected]",
"password": "PASTE_PASSWORD_FROM_EMAIL"
}{
"success": true,
"message": "Login successful",
"data": {
"user": {
"id": "6ad04a57c1abf3e526d845d7",
"created_at": "2026-10-15T03:36:55.825Z",
"updated_at": "2026-10-15T03:36:55.825Z",
"firstname": "grace",
"lastname": "okafor",
"email": "[email protected]",
"phone": "+2348012345678",
"status": "active",
"role": "admin",
"company_id": "6ad04a57c1abf3e526d845d5",
"title": "procurement manager",
"is_first_login": 0,
"partner_id": "6ad04994b5accb5031a052c6"
},
"company": {
"id": "6ad04a57c1abf3e526d845d5",
"name": "bpaas docs test co mv8zm7rw",
"email": "[email protected]",
"industry": "logistics",
"address": "12 Marina, Lagos"
},
"tokens": {
"accessToken": "<accessToken>",
"refreshToken": "<refreshToken>",
"expiresIn": 86400
}
}
}{
"success": false,
"message": "Invalid email or password"
}{
"success": false,
"message": "Too many failed sign-in attempts. Try again in 15 minutes."
}{
"success": false,
"message": "Invalid API key"
}Errors
| Status | When |
|---|---|
| 400 | Wrong email or password. |
| 401 | x-api-key is missing or invalid. |
| 403 | The account is suspended or deactivated, or the company was deleted. |
| 429 | 10 failed sign-ins for this email within 15 minutes. |
Refresh token
Exchanges a refresh token (valid 7 days) for a new access and refresh token pair. Each refresh token works once: store the new one from the response and discard the old one.
Body
| Field | Type | Description | |
|---|---|---|---|
| refreshToken | string | required | From Login or a previous refresh |
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/refresh' \
--header 'x-api-key: $PARTNER_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"refreshToken": "<refreshToken>"
}'{
"refreshToken": "<refreshToken>"
}{
"success": true,
"message": "Token refreshed successfully",
"data": {
"tokens": {
"accessToken": "<accessToken>",
"refreshToken": "<refreshToken>",
"expiresIn": 86400
}
}
}{
"success": false,
"message": "Invalid or expired refresh token"
}{
"success": false,
"message": "Invalid or expired refresh token"
}Errors
| Status | When |
|---|---|
| 401 | The refresh token was already used, has expired, or is not a refresh token. |
Logout
Revokes the refresh token and returns 204. The access token stays valid until it expires (24 hours), so discard it on your side as well.
Body
| Field | Type | Description | |
|---|---|---|---|
| refreshToken | string | optional | The refresh token to revoke |
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/logout' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"refreshToken": "<refreshToken>"
}'{
"refreshToken": "<refreshToken>"
}(no content)Password recovery
A three-step flow: request a code, verify it, then set the new password. Every step carries your partner key.
1. Forgot password → challenge_token (code emailed, valid 10 min)
2. Verify code → reset_token (valid 15 min)
3. Reset password → 204Forgot password
Starts recovery and returns a challenge_token. The response is the same whether or not the email has an account; a 6-digit code is emailed only to an active account.
This is also how a contact that OnePort created in its back office, who has never had a password, sets their first one.
Body
| Field | Type | Description | |
|---|---|---|---|
| string | required |
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/forgot-password' \
--header 'x-api-key: $PARTNER_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"email": "[email protected]"
}'{
"email": "[email protected]"
}{
"success": true,
"message": "If an account exists for this email, a verification code has been sent",
"data": {
"challenge_token": "<challenge_token>"
}
}Errors
| Status | When |
|---|---|
| 429 | More than 5 emailed codes (signup and recovery) for this email within an hour. |
Verify code
Checks the 6-digit code from the email (valid 10 minutes, 5 attempts) and returns a reset_token valid for 15 minutes.
Body
| Field | Type | Description | |
|---|---|---|---|
| challenge_token | string | required | From Forgot password |
| code | string | required | The 6-digit code from the email |
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/forgot-password/verify' \
--header 'x-api-key: $PARTNER_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"challenge_token": "<challenge_token>",
"code": "PASTE_CODE_FROM_EMAIL"
}'{
"challenge_token": "<challenge_token>",
"code": "PASTE_CODE_FROM_EMAIL"
}{
"success": true,
"data": {
"reset_token": "<reset_token>"
}
}{
"success": false,
"message": "Invalid verification code"
}Errors
| Status | When |
|---|---|
| 400 | Wrong or expired code, or too many attempts. |
Reset password
Sets the new password and returns 204. The reset token works once. A successful reset also clears a failed sign-in lockout.
Body
| Field | Type | Description | |
|---|---|---|---|
| reset_token | string | required | From Verify code |
| password | string | required | At least 8 characters |
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/reset-password' \
--header 'x-api-key: $PARTNER_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"reset_token": "<reset_token>",
"password": "NewPass#2026"
}'{
"reset_token": "<reset_token>",
"password": "NewPass#2026"
}(no content)Profile
The signed-in customer's own account. All requests use the customer's Bearer token.
Get profile
Returns { user, company } for the signed-in customer.
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/users/auth/me' \
--header 'Authorization: Bearer $ACCESS_TOKEN'{
"success": true,
"data": {
"user": {
"id": "6ad04a57c1abf3e526d845d7",
"created_at": "2026-10-15T03:36:55.825Z",
"updated_at": "2026-10-15T03:36:58.029Z",
"firstname": "grace",
"lastname": "okafor",
"email": "[email protected]",
"phone": "+2348012345678",
"status": "active",
"role": "admin",
"company_id": "6ad04a57c1abf3e526d845d5",
"title": "procurement manager",
"is_first_login": 1,
"last_login_date": "2026-10-15T03:36:58.029Z",
"partner_id": "6ad04994b5accb5031a052c6"
},
"company": {
"id": "6ad04a57c1abf3e526d845d5",
"name": "bpaas docs test co mv8zm7rw",
"email": "[email protected]",
"industry": "logistics",
"address": "12 Marina, Lagos"
}
}
}{
"success": false,
"message": "Access denied. No token provided."
}{
"success": false,
"message": "Invalid token."
}{
"success": false,
"message": "Your account has been deactivated. Please contact support."
}Errors
| Status | When |
|---|---|
| 401 | No token, or the token is invalid or expired. |
| 403 | The account is suspended or deactivated, or the company was deleted. |
Update profile
Send only the fields to change. Other fields are ignored. Returns the updated user.
Body
| Field | Type | Description | |
|---|---|---|---|
| firstname | string | optional | |
| lastname | string | optional | |
| phone | string | optional | |
| title | string | optional |
curl --request PUT 'https://test-bpass-api.oneport365.com/api/v1/users/auth/me' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"title": "Head of Procurement",
"phone": "+2348098765432"
}'{
"title": "Head of Procurement",
"phone": "+2348098765432"
}{
"success": true,
"data": {
"id": "6ad04a57c1abf3e526d845d7",
"created_at": "2026-10-15T03:36:55.825Z",
"updated_at": "2026-10-15T03:36:58.931Z",
"firstname": "grace",
"lastname": "okafor",
"email": "[email protected]",
"phone": "+2348098765432",
"status": "active",
"role": "admin",
"company_id": "6ad04a57c1abf3e526d845d5",
"title": "head of procurement",
"is_first_login": 1,
"last_login_date": "2026-10-15T03:36:58.029Z",
"partner_id": "6ad04994b5accb5031a052c6"
}
}Change password
Returns 204. new_password must be at least 8 characters and differ from the current one.
Body
| Field | Type | Description | |
|---|---|---|---|
| current_password | string | required | |
| new_password | string | required | At least 8 characters |
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/change-password' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"current_password": "PASTE_CURRENT_PASSWORD",
"new_password": "MyOwnPass#2026"
}'{
"current_password": "PASTE_CURRENT_PASSWORD",
"new_password": "MyOwnPass#2026"
}(no content){
"success": false,
"message": "Current password is incorrect"
}Deactivate account
Closes the customer's own account and returns 204. Later requests with this session get 403.
Body
| Field | Type | Description | |
|---|---|---|---|
| password | string | required | The customer's current password |
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/deactivate' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"password": "PASTE_CURRENT_PASSWORD"
}'{
"password": "PASTE_CURRENT_PASSWORD"
}(no content){
"success": false,
"message": "Password is incorrect"
}RFQs
Requests for quote, scoped to the signed-in customer's company. An RFQ is how a customer asks OnePort to move cargo; once OnePort books it, it becomes a shipment.
1. Upload documents (optional: packing list, proforma invoice)
↓
2. Create RFQ → status: incomplete
↓
3. Search rates (ocean freight only)
↓
4. Select rate (ocean freight only)
↓
5. Confirm RFQ → status: new rfq, sent to OnePort SalesOcean freight RFQs need a selected rate before they can be confirmed. Air freight, haulage and customs brokerage RFQs can be confirmed straight after creation; OnePort Sales prices them.
Upload RFQ document
Uploads a packing list or proforma invoice before you create the RFQ. Send the returned location as packing_list or proforma_invoice in the Create RFQ body. Documents cannot be added to an RFQ after it is created, and only your company's own uploads are accepted.
Form-data fields
| Field | Type | Description | |
|---|---|---|---|
| file | file | required | PDF or image |
| document_category | string | required | packing_list, proforma_invoice |
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/rfqs/documents' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--form 'file=@"./packing-list.pdf"' \
--form 'document_category=packing_list'{
"success": true,
"data": {
"location": "https://one-port-365-assets-dev-env.s3.eu-west-2.amazonaws.com/uploads/customer/6ad04a57c1abf3e526d845d5/packing_list/1792035420981-955cc36c5fac8af8.pdf",
"original_file_name": "packing-list.pdf"
}
}{
"success": false,
"message": "Send the document as multipart/form-data in a 'file' field"
}Create RFQ
Creates an RFQ for the customer's company. It starts as incomplete. The fields you send depend on the service: shipment_transport_type plus its load type (ocean_freight_type, cb_type) or direction (shipment_type for haulage).
400 instead of being ignored. Never send company_id or user_id: they come from the session.Common fields
| Field | Type | Description | |
|---|---|---|---|
| shipment_transport_type | string | required | ocean_freight, air_freight, haulage, customs_brokerage |
| shipment_type | string | required | import, export |
| ocean_freight_type | string | Ocean freight only, required: fcl, lcl | |
| cb_type | string | Customs brokerage only, required: fcl, lcl | |
| air_freight_type | string | Air freight only, required: port_to_port, port_to_door, door_to_port, door_to_door | |
| containers | array | required | Cargo lines, at least one. See Cargo lines. |
| packing_list | string (URL) | optional | location from Upload RFQ document |
| proforma_invoice | string (URL) | optional | location from Upload RFQ document |
| additional_comments | string | optional | Notes for OnePort Sales |
Fields by service
● required ○ optional ◐ required depending on haulage_type – not accepted
| Field | Ocean FCL | Ocean LCL | Air | Haulage import | Haulage export | Customs FCL | Customs LCL |
|---|---|---|---|---|---|---|---|
| origin_port Port name, e.g. Barcelona (ESBCN) Spain | ● | ● | ○ | ○ | ● | ● | ● |
| origin_port_code UN/LOCODE; IATA code for air | ● | ● | ● | ○ | ● | ● | ● |
| destination_port | ● | ● | ○ | ● | ○ | ● | ● |
| destination_port_code | ● | ● | ● | ● | ○ | ● | ● |
incotermsEXW, FOB, CIF, CFR, FAS, DAP, DDP, DPU, CPT, CIP, FCA | ● | – | ● | ● | ● | – | – |
| goods_value string | ● | ● | – | ● | ● | ● | ● |
goods_value_currencyUSD, EUR, GBP, NGN, CNY, AED, INR, ZAR … | ● | ● | – | ● | ● | ● | ● |
| goods_weight number, total weight | – | – | ● | – | – | – | – |
| cargo_ready_date date | – | – | ○ | ○ | ○ | – | – |
| shipment_target_date date | – | – | ● | ● | ● | – | – |
| bl_number string | ○ | ○ | – | ○ | ○ | ○ | ○ |
| with_haulage boolean, add haulage | ○ | ○ | ○ | – | – | – | – |
| haulage_type With with_haulage: origin, destination, both | ◐ | ◐ | ◐ | ○ | ○ | – | – |
| pickup_location Origin address | ◐ | ◐ | ◐ | ○ | ○ | – | – |
| destination_address Delivery address | ◐ | ◐ | ◐ | ● | – | – | – |
| customs_brokerage boolean, add customs clearance | ○ | ○ | ○ | ○ | ○ | – | – |
| origin_address Inland pickup address | – | – | – | – | ● | – | – |
| stuffing_location string | – | – | – | ○ | ● | – | – |
| stuffing_date date | – | – | – | ○ | ○ | – | – |
| tdo_written_date Terminal Delivery Order date | – | – | – | ● | – | – | – |
| tdo_expiry_date date | – | – | – | ● | – | – | – |
| with_tracker boolean | – | – | – | ○ | ○ | – | – |
| with_escort boolean | – | – | – | ○ | ○ | – | – |
brokerage_typefast_track, physical_examination, bond, scan | – | – | – | – | – | ● | ○ |
| senders_name string | – | – | – | – | – | ● | ● |
| senders_address string | – | – | – | – | – | ● | ● |
transport_modeocean, air | – | – | – | – | – | ○ | ○ |
| port_eta date | – | – | – | – | – | ○ | ○ |
With with_haulage: true, haulage_type is required, and so is the address for each side it covers: pickup_location for origin, destination_address for destination, both for both. Air freight also needs pickup_location for door_to_* and destination_address for *_to_door.
Cargo lines
Each entry in containers is one cargo line. A request can mix lines with different sizes or commodities. Pick commodity_chapter, commodity_category, commodity_description and commodity_hs_code from Commodities.
| Field | FCL lines Ocean FCL, haulage, customs FCL | LCL lines Ocean LCL, customs LCL | Air lines |
|---|---|---|---|
| commodity_type Cargo class: FAK, DG | ● | ● | ● |
| commodity_description What the cargo is | ● | ● | ● |
| commodity_chapter From Commodities | ○ | ○ | ○ |
| commodity_category From Commodities | ○ | ○ | ○ |
| commodity_hs_code From Commodities | ○ | ○ | ○ |
| container_count string; boxes, packages or pallets | ● | ○ | ● |
container_size20FT, 40FT, 40HC … | ● | – | – |
| container_type FCL: dry, reefer; LCL: package type, e.g. pallet | ● | ○ | – |
| container_weight string | ● | ● | – |
weight_unitkg, pounds, tons | ● | ● | – |
| container_length string | – | ● | ● |
| container_width string | – | ● | ● |
| container_height string | – | ● | ● |
dimension_unitcm, mm, in | – | ● | ● |
| volumetric_weight string | – | ○ | ○ |
Examples by service
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/rfqs' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Content-Type: application/json' \
--data @rfq.json # one of the bodies in the other tabs{
"shipment_transport_type": "ocean_freight",
"ocean_freight_type": "fcl",
"shipment_type": "import",
"origin_port_code": "ESBCN",
"origin_port": "Barcelona (ESBCN) Spain",
"destination_port_code": "NGAPP",
"destination_port": "Apapa (NGAPP) Nigeria",
"incoterms": "FOB",
"goods_value": "45000",
"goods_value_currency": "USD",
"with_haulage": true,
"haulage_type": "destination",
"destination_address": "12 Ikorodu Road, Lagos",
"customs_brokerage": true,
"additional_comments": "Please include destination clearance.",
"packing_list": "https://…/packing_list/1792035420981-955cc36c5fac8af8.pdf",
"proforma_invoice": "https://…/proforma_invoice/1792035421910-6da129b940fbed7f.pdf",
"containers": [
{
"commodity_type": "FAK",
"container_size": "20FT",
"container_type": "dry",
"container_count": "1",
"container_weight": "23000",
"weight_unit": "kg",
"commodity_chapter": "Agro Commodities",
"commodity_category": "Livestock & Animals",
"commodity_description": "Live Purebred breeding cattle",
"commodity_hs_code": "102210000"
},
{
"commodity_type": "FAK",
"container_size": "40HC",
"container_type": "dry",
"container_count": "2",
"container_weight": "18000",
"weight_unit": "kg",
"commodity_description": "Assorted kitchen utensils"
}
]
}{
"shipment_type": "import",
"shipment_transport_type": "ocean_freight",
"ocean_freight_type": "lcl",
"origin_port": "Shanghai (CNSHA) China",
"origin_port_code": "CNSHA",
"destination_port": "Apapa (NGAPP) Nigeria",
"destination_port_code": "NGAPP",
"goods_value": "8000",
"goods_value_currency": "USD",
"containers": [
{
"container_type": "pallet",
"container_count": "4",
"container_length": "120",
"container_width": "100",
"container_height": "150",
"container_weight": "800",
"weight_unit": "kg",
"dimension_unit": "cm",
"commodity_type": "FAK",
"commodity_description": "Machine spare parts"
}
]
}{
"shipment_type": "import",
"shipment_transport_type": "air_freight",
"air_freight_type": "port_to_port",
"origin_port_code": "LHR",
"destination_port_code": "LOS",
"incoterms": "EXW",
"cargo_ready_date": "2026-11-05",
"shipment_target_date": "2026-11-20",
"goods_weight": "350",
"containers": [
{
"container_count": "3",
"container_length": "80",
"container_width": "60",
"container_height": "50",
"dimension_unit": "cm",
"commodity_type": "FAK",
"commodity_description": "Laptop computers"
}
]
}{
"shipment_type": "import",
"shipment_transport_type": "haulage",
"destination_port": "Apapa (NGAPP) Nigeria",
"destination_port_code": "NGAPP",
"destination_address": "22 Kudirat Abiola Way, Ikeja, Lagos",
"stuffing_location": "Apapa terminal",
"tdo_written_date": "2026-11-02",
"tdo_expiry_date": "2026-11-16",
"shipment_target_date": "2026-11-10",
"incoterms": "CIF",
"goods_value": "30000",
"goods_value_currency": "USD",
"with_tracker": true,
"with_escort": false,
"containers": [
{
"commodity_type": "FAK",
"container_size": "40FT",
"container_type": "dry",
"container_count": "1",
"container_weight": "20000",
"weight_unit": "kg",
"commodity_description": "Building materials"
}
]
}{
"shipment_type": "export",
"shipment_transport_type": "haulage",
"origin_address": "Km 38 Lagos-Ibadan Expressway, Ogun",
"origin_port": "Apapa (NGAPP) Nigeria",
"origin_port_code": "NGAPP",
"stuffing_location": "Factory warehouse, Ogun",
"stuffing_date": "2026-11-04",
"shipment_target_date": "2026-11-08",
"incoterms": "FOB",
"goods_value": "55000",
"goods_value_currency": "USD",
"containers": [
{
"commodity_type": "FAK",
"container_size": "20FT",
"container_type": "dry",
"container_count": "1",
"container_weight": "18000",
"weight_unit": "kg",
"commodity_description": "Sesame seeds"
}
]
}{
"shipment_type": "import",
"shipment_transport_type": "customs_brokerage",
"cb_type": "fcl",
"origin_port": "Antwerp (BEANR) Belgium",
"origin_port_code": "BEANR",
"destination_port": "Tin Can Island (NGTIN) Nigeria",
"destination_port_code": "NGTIN",
"brokerage_type": "fast_track",
"senders_name": "Euro Parts BV",
"senders_address": "Haven 1100, 2030 Antwerp, Belgium",
"transport_mode": "ocean",
"port_eta": "2026-11-18",
"goods_value": "60000",
"goods_value_currency": "EUR",
"containers": [
{
"commodity_type": "FAK",
"container_size": "40FT",
"container_type": "dry",
"container_count": "1",
"container_weight": "20000",
"weight_unit": "kg",
"commodity_description": "Used vehicle parts"
}
]
}{
"shipment_type": "import",
"shipment_transport_type": "customs_brokerage",
"cb_type": "lcl",
"origin_port": "Antwerp (BEANR) Belgium",
"origin_port_code": "BEANR",
"destination_port": "Tin Can Island (NGTIN) Nigeria",
"destination_port_code": "NGTIN",
"brokerage_type": "bond",
"senders_name": "Euro Parts BV",
"senders_address": "Haven 1100, 2030 Antwerp, Belgium",
"transport_mode": "ocean",
"port_eta": "2026-11-18",
"goods_value": "12000",
"goods_value_currency": "EUR",
"containers": [
{
"container_count": "2",
"container_length": "120",
"container_width": "80",
"container_height": "100",
"dimension_unit": "cm",
"container_weight": "450",
"weight_unit": "kg",
"commodity_type": "FAK",
"commodity_description": "Used vehicle parts"
}
]
}{
"success": true,
"message": "Your request for quote has been received.",
"data": {
"id": "6ad04a5ec1abf3e526d84603",
"rfq_number": "RFQ-26-10-032",
"shipment_status": "incomplete",
"shipment_type": "import",
"shipment_transport_type": "ocean_freight",
"additional_comments": "Please include destination clearance.",
"created_at": "2026-10-15T03:37:02.985Z",
"updated_at": "2026-10-15T03:37:02.985Z",
"origin_port": "Barcelona (ESBCN) Spain",
"origin_port_code": "ESBCN",
"destination_port": "Apapa (NGAPP) Nigeria",
"destination_port_code": "NGAPP",
"ocean_freight_type": "fcl",
"incoterms": "FOB",
"goods_value": "45000",
"goods_value_currency": "USD",
"with_haulage": true,
"customs_brokerage": true,
"haulage_type": "destination",
"destination_address": "12 Ikorodu Road, Lagos",
"with_tracker": false,
"raised_by": {
"id": "6ad04a57c1abf3e526d845d7",
"full_name": "grace okafor"
},
"selected_rate": null,
"containers": [
{
"id": "6ad04a5fc1abf3e526d84605",
"commodity_type": "fak",
"commodity_hs_code": "102210000",
"commodity_description": "live purebred breeding cattle",
"commodity_chapter": "agro commodities",
"commodity_category": "livestock & animals",
"container_size": "20FT",
"container_type": "dry",
"container_count": "1",
"container_weight": "23000",
"weight_unit": "kg"
},
{
"id": "6ad04a5fc1abf3e526d84607",
"commodity_type": "fak",
"commodity_description": "assorted kitchen utensils",
"container_size": "40HC",
"container_type": "dry",
"container_count": "2",
"container_weight": "18000",
"weight_unit": "kg"
}
],
"documents": [
{
"id": "6ad04a5fc1abf3e526d84609",
"document_category": "commercial_shipping",
"document_name": "Packing List",
"original_file_name": "1792035420981-955cc36c5fac8af8.pdf",
"document_location": "https://one-port-365-assets-dev-env.s3.eu-west-2.amazonaws.com/uploads/customer/6ad04a57c1abf3e526d845d5/packing_list/1792035420981-955cc36c5fac8af8.pdf",
"created_at": "2026-10-15T03:37:03.423Z"
},
{
"id": "6ad04a5fc1abf3e526d8460c",
"document_category": "commercial_shipping",
"document_name": "Proforma Invoice",
"original_file_name": "1792035421910-6da129b940fbed7f.pdf",
"document_location": "https://one-port-365-assets-dev-env.s3.eu-west-2.amazonaws.com/uploads/customer/6ad04a57c1abf3e526d845d5/proforma_invoice/1792035421910-6da129b940fbed7f.pdf",
"created_at": "2026-10-15T03:37:03.939Z"
}
]
}
}{
"success": false,
"message": "origin_port, destination_port, incoterms, goods_value, goods_value_currency are required for ocean_freight (fcl)"
}{
"success": false,
"message": "company_id (taken from your account) cannot be sent on an RFQ"
}Errors
| Status | When |
|---|---|
| 400 | A required field is missing, a field does not apply to the service, a cargo field was sent outside containers, or a server-set field (company_id, user_id) was sent. |
Search rates
Ocean freight rates for the RFQ's lane and container sizes, unexpired, closest match first. Only rates for the RFQ's own ports are returned, so a lane with none returns an empty list.
Each rate has prices: [{ container_size, price }]. These are catalogue prices; OnePort adds its margin on the quote. The page also carries match_level (exact or similar) and selected_rate_id.
Query parameters
| Param | Type | Description | |
|---|---|---|---|
| page | integer | optional | Default 1 |
| limit | integer | optional | Default 10 |
| carrier_name | string | optional | Filter by carrier, e.g. MSC |
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/rfqs/6ad04a5ec1abf3e526d84603/rates?page=1&limit=10' \
--header 'Authorization: Bearer $ACCESS_TOKEN'{
"success": true,
"data": {
"data": [
{
"id": "6ab10d88b97056455ee0dd57",
"carrier_name": "cma cgm",
"origin": "Spain",
"destination": "Nigeria",
"origin_port_code": "ESBCN",
"destination_port_code": "NGAPP",
"currency": "USD",
"prices": [
{
"container_size": "20FT",
"price": 300
},
{
"container_size": "40HC",
"price": 550
}
],
"transit_time": "5",
"free_time": "0",
"valid_to": "2026-10-24T00:00:00.000Z",
"commodity_type": "FAK",
"match_level": "exact"
}
],
"total": 1,
"page": 1,
"limit": 10,
"total_pages": 1,
"paging_counter": 0,
"has_prev_page": false,
"has_next_page": false,
"prev_page": 0,
"next_page": 0,
"match_level": "similar",
"selected_rate_id": null
}
}{
"success": false,
"message": "Online rates are only available for ocean freight for now"
}Errors
| Status | When |
|---|---|
| 400 | The RFQ is not ocean freight, or it has already been confirmed. |
Select rate
Picks a rate from the search results. Selecting again replaces the previous choice.
Body
| Field | Type | Description | |
|---|---|---|---|
| rate_id | string | required | id of a rate from Search rates |
curl --request PUT 'https://test-bpass-api.oneport365.com/api/v1/rfqs/6ad04a5ec1abf3e526d84603/selected-rate' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"rate_id": "6ab10d88b97056455ee0dd57"
}'{
"rate_id": "6ab10d88b97056455ee0dd57"
}{
"success": true,
"message": "Rate selected.",
"data": {
"rate_id": "6ab10d88b97056455ee0dd57",
"category": "ocean_freight",
"carrier_name": "cma cgm",
"origin": "Spain",
"destination": "Nigeria",
"origin_port_code": "ESBCN",
"destination_port_code": "NGAPP",
"currency": "USD",
"transit_time": "5",
"free_time": "0",
"valid_to": "2026-10-24T00:00:00.000Z",
"match_level": "exact",
"prices": [
{
"container_size": "20FT",
"price": 300
},
{
"container_size": "40HC",
"price": 550
}
],
"selected_at": "2026-10-15T03:37:16.639Z"
}
}{
"success": false,
"message": "This rate is not available for this RFQ. Search again and pick one from the results."
}Errors
| Status | When |
|---|---|
| 400 | The rate isn't in this RFQ's search results (expired, another lane, or no price for its containers), or the RFQ is already confirmed. |
Confirm RFQ
Moves the RFQ from incomplete to new rfq and sends it to OnePort Sales. Ocean freight needs a selected rate that hasn't expired. After confirming, search, select and confirm all return 400.
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/rfqs/6ad04a5ec1abf3e526d84603/confirm' \
--header 'Authorization: Bearer $ACCESS_TOKEN'{
"success": true,
"message": "Your request for quote has been sent to OnePort.",
"data": {
"id": "6ad04a5ec1abf3e526d84603",
"rfq_number": "RFQ-26-10-032",
"shipment_status": "new rfq",
"shipment_type": "import",
"shipment_transport_type": "ocean_freight",
"additional_comments": "Please include destination clearance.",
"created_at": "2026-10-15T03:37:02.985Z",
"updated_at": "2026-10-15T03:37:17.614Z",
"origin_port": "Barcelona (ESBCN) Spain",
"origin_port_code": "ESBCN",
"destination_port": "Apapa (NGAPP) Nigeria",
"destination_port_code": "NGAPP",
"ocean_freight_type": "fcl",
"incoterms": "FOB",
"goods_value": "45000",
"goods_value_currency": "USD",
"with_haulage": true,
"customs_brokerage": true,
"haulage_type": "destination",
"destination_address": "12 Ikorodu Road, Lagos",
"with_tracker": false,
"raised_by": {
"id": "6ad04a57c1abf3e526d845d7",
"full_name": "grace okafor"
},
"selected_rate": {
"rate_id": "6ab10d88b97056455ee0dd57",
"category": "ocean_freight",
"carrier_name": "cma cgm",
"origin": "Spain",
"destination": "Nigeria",
"origin_port_code": "ESBCN",
"destination_port_code": "NGAPP",
"currency": "USD",
"transit_time": "5",
"free_time": "0",
"valid_to": "2026-10-24T00:00:00.000Z",
"match_level": "exact",
"prices": [
{
"container_size": "20FT",
"price": 300
},
{
"container_size": "40HC",
"price": 550
}
],
"selected_at": "2026-10-15T03:37:16.639Z"
},
"containers": [
{
"id": "6ad04a5fc1abf3e526d84605",
"commodity_type": "fak",
"commodity_hs_code": "102210000",
"commodity_description": "live purebred breeding cattle",
"commodity_chapter": "agro commodities",
"commodity_category": "livestock & animals",
"container_size": "20FT",
"container_type": "dry",
"container_count": "1",
"container_weight": "23000",
"weight_unit": "kg"
},
{
"id": "6ad04a5fc1abf3e526d84607",
"commodity_type": "fak",
"commodity_description": "assorted kitchen utensils",
"container_size": "40HC",
"container_type": "dry",
"container_count": "2",
"container_weight": "18000",
"weight_unit": "kg"
}
],
"documents": [
{
"id": "6ad04a5fc1abf3e526d84609",
"document_category": "commercial_shipping",
"document_name": "Packing List",
"original_file_name": "1792035420981-955cc36c5fac8af8.pdf",
"document_location": "https://one-port-365-assets-dev-env.s3.eu-west-2.amazonaws.com/uploads/customer/6ad04a57c1abf3e526d845d5/packing_list/1792035420981-955cc36c5fac8af8.pdf",
"created_at": "2026-10-15T03:37:03.423Z"
},
{
"id": "6ad04a5fc1abf3e526d8460c",
"document_category": "commercial_shipping",
"document_name": "Proforma Invoice",
"original_file_name": "1792035421910-6da129b940fbed7f.pdf",
"document_location": "https://one-port-365-assets-dev-env.s3.eu-west-2.amazonaws.com/uploads/customer/6ad04a57c1abf3e526d845d5/proforma_invoice/1792035421910-6da129b940fbed7f.pdf",
"created_at": "2026-10-15T03:37:03.939Z"
}
]
}
}{
"success": false,
"message": "Select a rate before confirming this RFQ"
}{
"success": false,
"message": "This RFQ has already been confirmed"
}List RFQs
The company's RFQs, newest first, including incomplete ones.
Query parameters
| Param | Type | Description | |
|---|---|---|---|
| page | integer | optional | Default 1 |
| limit | integer | optional | Default 10 |
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/rfqs?page=1&limit=10' \
--header 'Authorization: Bearer $ACCESS_TOKEN'{
"success": true,
"data": {
"total": 7,
"page": 1,
"paging_counter": 0,
"limit": 3,
"total_pages": 3,
"data": [
{
"id": "6ad04a68c1abf3e526d8464f",
"rfq_number": "RFQ-26-10-038",
"shipment_status": "incomplete",
"shipment_type": "import",
"shipment_transport_type": "customs_brokerage",
"created_at": "2026-10-15T03:37:12.494Z",
"updated_at": "2026-10-15T03:37:12.494Z",
"origin_port": "Antwerp (BEANR) Belgium",
"origin_port_code": "BEANR",
"destination_port": "Tin Can Island (NGTIN) Nigeria",
"destination_port_code": "NGTIN",
"raised_by": {
"id": "6ad04a57c1abf3e526d845d7",
"full_name": "grace okafor"
},
"selected_rate": null
},
{
"id": "6ad04a67c1abf3e526d84644",
"rfq_number": "RFQ-26-10-037",
"shipment_status": "incomplete",
"shipment_type": "import",
"shipment_transport_type": "customs_brokerage",
"created_at": "2026-10-15T03:37:11.177Z",
"updated_at": "2026-10-15T03:37:11.177Z",
"origin_port": "Antwerp (BEANR) Belgium",
"origin_port_code": "BEANR",
"destination_port": "Tin Can Island (NGTIN) Nigeria",
"destination_port_code": "NGTIN",
"raised_by": {
"id": "6ad04a57c1abf3e526d845d7",
"full_name": "grace okafor"
},
"selected_rate": null
},
{
"id": "6ad04a66c1abf3e526d84639",
"rfq_number": "RFQ-26-10-036",
"shipment_status": "incomplete",
"shipment_type": "export",
"shipment_transport_type": "haulage",
"created_at": "2026-10-15T03:37:10.005Z",
"updated_at": "2026-10-15T03:37:10.005Z",
"origin_port": "Apapa (NGAPP) Nigeria",
"origin_port_code": "NGAPP",
"raised_by": {
"id": "6ad04a57c1abf3e526d845d7",
"full_name": "grace okafor"
},
"selected_rate": null
}
],
"has_prev_page": false,
"has_next_page": true,
"prev_page": 0,
"next_page": 2
}
}Get RFQ
One of the company's RFQs, with its cargo lines, documents and selected rate.
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/rfqs/6ad04a5ec1abf3e526d84603' \
--header 'Authorization: Bearer $ACCESS_TOKEN'{
"success": true,
"data": {
"id": "6ad04a5ec1abf3e526d84603",
"rfq_number": "RFQ-26-10-032",
"shipment_status": "new rfq",
"shipment_type": "import",
"shipment_transport_type": "ocean_freight",
"additional_comments": "Please include destination clearance.",
"created_at": "2026-10-15T03:37:02.985Z",
"updated_at": "2026-10-15T03:37:17.614Z",
"origin_port": "Barcelona (ESBCN) Spain",
"origin_port_code": "ESBCN",
"destination_port": "Apapa (NGAPP) Nigeria",
"destination_port_code": "NGAPP",
"ocean_freight_type": "fcl",
"incoterms": "FOB",
"goods_value": "45000",
"goods_value_currency": "USD",
"with_haulage": true,
"customs_brokerage": true,
"haulage_type": "destination",
"destination_address": "12 Ikorodu Road, Lagos",
"with_tracker": false,
"raised_by": {
"id": "6ad04a57c1abf3e526d845d7",
"full_name": "grace okafor"
},
"selected_rate": {
"rate_id": "6ab10d88b97056455ee0dd57",
"category": "ocean_freight",
"carrier_name": "cma cgm",
"origin": "Spain",
"destination": "Nigeria",
"origin_port_code": "ESBCN",
"destination_port_code": "NGAPP",
"currency": "USD",
"transit_time": "5",
"free_time": "0",
"valid_to": "2026-10-24T00:00:00.000Z",
"match_level": "exact",
"prices": [
{
"container_size": "20FT",
"price": 300
},
{
"container_size": "40HC",
"price": 550
}
],
"selected_at": "2026-10-15T03:37:16.639Z"
},
"containers": [
{
"id": "6ad04a5fc1abf3e526d84605",
"commodity_type": "fak",
"commodity_hs_code": "102210000",
"commodity_description": "live purebred breeding cattle",
"commodity_chapter": "agro commodities",
"commodity_category": "livestock & animals",
"container_size": "20FT",
"container_type": "dry",
"container_count": "1",
"container_weight": "23000",
"weight_unit": "kg"
},
{
"id": "6ad04a5fc1abf3e526d84607",
"commodity_type": "fak",
"commodity_description": "assorted kitchen utensils",
"container_size": "40HC",
"container_type": "dry",
"container_count": "2",
"container_weight": "18000",
"weight_unit": "kg"
}
],
"documents": [
{
"id": "6ad04a5fc1abf3e526d84609",
"document_category": "commercial_shipping",
"document_name": "Packing List",
"original_file_name": "1792035420981-955cc36c5fac8af8.pdf",
"document_location": "https://one-port-365-assets-dev-env.s3.eu-west-2.amazonaws.com/uploads/customer/6ad04a57c1abf3e526d845d5/packing_list/1792035420981-955cc36c5fac8af8.pdf",
"created_at": "2026-10-15T03:37:03.423Z"
},
{
"id": "6ad04a5fc1abf3e526d8460c",
"document_category": "commercial_shipping",
"document_name": "Proforma Invoice",
"original_file_name": "1792035421910-6da129b940fbed7f.pdf",
"document_location": "https://one-port-365-assets-dev-env.s3.eu-west-2.amazonaws.com/uploads/customer/6ad04a57c1abf3e526d845d5/proforma_invoice/1792035421910-6da129b940fbed7f.pdf",
"created_at": "2026-10-15T03:37:03.939Z"
}
]
}
}{
"success": false,
"message": "RFQ not found"
}Shipments
Booked shipments, scoped to the signed-in customer's company. An RFQ appears here once OnePort books it; RFQs still being quoted stay under RFQs.
List shipments
The company's booked shipments, newest first. All filters are optional. A new company's list is empty until OnePort books one of its RFQs.
Query parameters
| Param | Type | Description | |
|---|---|---|---|
| page | integer | optional | Default 1 |
| limit | integer | optional | Default 10, max 100 |
| search | string | optional | Job, BL or RFQ number, or port |
| shipment_status | string | optional | pending, active, post shipment, completed, cancelled |
| shipment_type | string | optional | import, export |
| shipment_transport_type | string | optional | ocean_freight, air_freight, haulage, customs_brokerage |
| start_date | date | optional | e.g. 2026-01-01 |
| end_date | date | optional | e.g. 2026-12-31 |
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/shipments?page=1&limit=10&shipment_status=active' \
--header 'Authorization: Bearer $ACCESS_TOKEN'{
"success": true,
"data": {
"total": 0,
"page": 1,
"paging_counter": 0,
"limit": 10,
"total_pages": 0,
"data": [],
"has_prev_page": false,
"has_next_page": false,
"prev_page": 0,
"next_page": 0
}
}{
"success": false,
"message": "The selected shipment status is invalid."
}Get shipment
One shipment with its containers (cargo lines) and documents. Each document has category and type labels and uploaded_by: oneport or customer.
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/shipments/:id' \
--header 'Authorization: Bearer $ACCESS_TOKEN'{
"success": false,
"message": "Shipment not found"
}Errors
| Status | When |
|---|---|
| 404 | Unknown id, an RFQ that isn't booked yet, or another company's shipment. |
Document categories
The category → document type tree for the upload form. Import and export have different trees, so pass the shipment's shipment_type. Without it, both trees come back keyed by direction.
Query parameters
| Param | Type | Description | |
|---|---|---|---|
| shipment_type | string | optional | import, export; omit for both trees |
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/shipments/document-categories?shipment_type=import' \
--header 'Authorization: Bearer $ACCESS_TOKEN'{
"success": true,
"data": [
{
"key": "commercial_shipping",
"label": "Commercial & Shipping",
"types": [
{
"key": "commercial_invoice",
"label": "Commercial Invoice"
},
{
"key": "packing_list",
"label": "Packing List"
},
{
"key": "bill_of_lading_swb_or_telex",
"label": "Bill of Lading (SWB or Telex)"
},
{
"key": "certificate_of_origin",
"label": "Certificate of Origin"
},
{
"key": "air_waybill",
"label": "Air Waybill"
},
{
"key": "ccvo",
"label": "CCVO"
},
{
"key": "insurance_certificate",
"label": "Insurance Certificate"
},
{
"key": "others",
"label": "Others"
}
]
},
{
"key": "regulatory_customs",
"label": "Regulatory & Customs",
"types": [
{
"key": "form_m",
"label": "Form M"
},
{
"key": "paar",
"label": "PAAR"
},
{
"key": "soncap_son_documents",
"label": "SONCAP / SON Documents"
},
{
"key": "nafdac_documents",
"label": "NAFDAC Documents"
},
{
"key": "nesrea_documents",
"label": "NESREA Documents"
},
{
"key": "ncs_required_permits_approvals",
"label": "NCS-Required Permits/Approvals"
},
{
"key": "end_user_certificate",
"label": "End User Certificate"
},
{
"key": "product_specific_regulatory_permits",
"label": "Product-Specific Regulatory Permits"
},
{
"key": "customs_duty_payment_evidence",
"label": "Customs Duty Payment Evidence"
},
{
"key": "others",
"label": "Others"
}
]
},
{
"key": "importer_consignee",
"label": "Importer/Consignee Documents",
"types": [
{
"key": "importer_authorisation_letter_of_authority",
"label": "Importer Authorisation / Letter of Authority"
},
{
"key": "shipping_invoice",
"label": "Shipping Invoice"
},
{
"key": "shipping_receipt",
"label": "Shipping Receipt"
},
{
"key": "delivery_order",
"label": "Delivery Order"
},
{
"key": "terminal_invoice",
"label": "Terminal Invoice"
},
{
"key": "others",
"label": "Others"
}
]
},
{
"key": "clearing",
"label": "Clearing Documents",
"types": [
{
"key": "terminal_receipt",
"label": "Terminal Receipt"
},
{
"key": "final_assessment",
"label": "Final Assessment"
},
{
"key": "inspection_act",
"label": "Inspection Act"
},
{
"key": "exit_note_gate",
"label": "Exit Note/Gate"
},
{
"key": "tdo",
"label": "TDO"
},
{
"key": "eir",
"label": "EIR"
},
{
"key": "waybill",
"label": "Waybill"
},
{
"key": "others",
"label": "Others"
}
]
}
]
}{
"success": true,
"data": [
{
"key": "commercial",
"label": "Commercial Documents",
"types": [
{
"key": "proforma_invoice",
"label": "Proforma Invoice"
},
{
"key": "packing_list",
"label": "Packing List"
},
{
"key": "commercial_invoice",
"label": "Commercial Invoice"
},
{
"key": "others",
"label": "Others"
}
]
},
{
"key": "regulatory_export",
"label": "Regulatory & Export Documents",
"types": [
{
"key": "nxp_form",
"label": "NXP Form"
},
{
"key": "clean_certificate_of_inspection",
"label": "Clean Certificate of Inspection"
},
{
"key": "single_goods_declaration_sgd",
"label": "Single Goods Declaration (SGD)"
},
{
"key": "inspection_act",
"label": "Inspection Act"
},
{
"key": "shipping_export_docs_acknowledgement",
"label": "Shipping Export Docs Acknowledgement"
},
{
"key": "vessel_plan_confirmation",
"label": "Vessel Plan Confirmation"
},
{
"key": "terminal_invoice",
"label": "Terminal Invoice"
},
{
"key": "terminal_receipt",
"label": "Terminal Receipt"
},
{
"key": "customs_examination_release_documentation",
"label": "Customs Examination/Release Documentation"
},
{
"key": "eir_indemnity",
"label": "EIR / Indemnity"
},
{
"key": "others",
"label": "Others"
}
]
},
{
"key": "shipping",
"label": "Shipping Documents",
"types": [
{
"key": "booking_confirmation",
"label": "Booking Confirmation"
},
{
"key": "shipping_instruction",
"label": "Shipping Instruction"
},
{
"key": "bill_of_lading_sea_waybill",
"label": "Bill of Lading / Sea Waybill"
},
{
"key": "shipping_invoice_freight",
"label": "Shipping Invoice (Freight)"
},
{
"key": "shipping_payment_freight",
"label": "Shipping Payment (Freight)"
},
{
"key": "shipping_invoice_local",
"label": "Shipping Invoice (Local)"
},
{
"key": "shipping_receipt_local",
"label": "Shipping Receipt (Local)"
},
{
"key": "others",
"label": "Others"
}
]
},
{
"key": "post_shipment",
"label": "Post Shipment Documents",
"types": [
{
"key": "certificate_of_origin",
"label": "Certificate of Origin"
},
{
"key": "fumigation_certificate",
"label": "Fumigation Certificate"
},
{
"key": "phytosanitary_certificate",
"label": "Phytosanitary Certificate"
},
{
"key": "son_export_regulatory_documents",
"label": "SON/Export Regulatory Documents"
},
{
"key": "exporter_acknowledged_copy",
"label": "Exporter Acknowledged Copy"
},
{
"key": "other_commodity_specific_permits",
"label": "Other Commodity-Specific Permits"
},
{
"key": "others",
"label": "Others"
}
]
}
]
}Upload shipment document
Files a document against a booked shipment and returns 201. It is recorded as the customer's (uploaded_by: customer) and never replaces an existing document.
Form-data fields
| Field | Type | Description | |
|---|---|---|---|
| file | file | required | PDF, PNG, JPG, Excel, CSV or Word |
| document_category | string | required | A category key from Document categories |
| document_type | string | required | A type key within that category |
| document_name | string | Required only when document_type is others |
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/shipments/:id/documents' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--form 'file=@"./commercial-invoice.pdf"' \
--form 'document_category=commercial_shipping' \
--form 'document_type=commercial_invoice'{
"success": false,
"message": "Shipment not found"
}{
"success": false,
"message": "The document type field is required."
}Errors
| Status | When |
|---|---|
| 400 | A field is missing, or the category or type isn't valid for the shipment's direction. |
| 404 | Unknown id or another company's shipment. |
Reference data
Lookups for filling in an RFQ.
Airports
Airport picker for air freight RFQs. Use port_code as origin_port_code or destination_port_code; OnePort fills in the airport name and details.
Query parameters
| Param | Type | Description | |
|---|---|---|---|
| search | string | optional | Name, city or code |
| limit | integer | optional |
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/reference/airports?search=lagos&limit=20' \
--header 'Authorization: Bearer $ACCESS_TOKEN'{
"success": true,
"data": {
"total": 1,
"page": 1,
"paging_counter": 0,
"limit": 5,
"total_pages": 1,
"data": [
{
"id": "67c7c7b462f127463dec4bd0",
"name": "Murtala Muhammed International Airport",
"port_code": "LOS",
"city": "Lagos",
"country_code": "NG",
"country_name": "Nigeria"
}
],
"has_prev_page": false,
"has_next_page": false,
"prev_page": 0,
"next_page": 0
}
}{
"success": false,
"message": "Access denied. No token provided."
}Commodities
HS-code commodity picker, organised as chapter → category → HS code. No sign-in needed. Send one query key at a time; commodity_description and hs_code may be combined.
Copy the picked names onto each RFQ cargo line as commodity_chapter, commodity_category, commodity_description and commodity_hs_code.
commodity_type query key here searches HS chapters. On an RFQ cargo line, commodity_type means the cargo class (FAK or DG), which is different.Query parameters
| Param | Type | Description | |
|---|---|---|---|
| commodity_type | string | optional | Search chapters (empty = all) |
| commodity_category | string | optional | Search categories (empty = all) |
| commodity_description | string | optional | Search HS codes by description |
| hs_code | string | optional | Search by HS code |
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/reference/commodities?commodity_type=agro'{
"success": true,
"message": "commodities fetched Successfully",
"data": [
{
"_id": "68a439bd3a4912126b6c9412",
"name": "Agro Commodities",
"type": "chapter"
}
]
}{
"success": true,
"message": "commodities fetched Successfully",
"data": [
{
"_id": "68a43bc2dc29c613727c985f",
"name": "Grains & Cereals",
"type": "category",
"level1": "68a439bd3a4912126b6c9412"
}
]
}{
"success": true,
"message": "commodities fetched Successfully",
"data": [
{
"_id": "68a442b8c466711783946f3c",
"name": "Meat of horses, asses, mules or hinnies, fresh, chilled or frozen.",
"code": "205000000",
"type": "hsCode",
"level1": "68a439bd3a4912126b6c9415",
"level2": "68a43bc3dc29c613727c9868"
},
{
"_id": "68a442e1c466711783947078",
"name": "Jack and horse mackerel (Trachurus spp.) meat, fresh or chilled.",
"code": "302450000",
"type": "hsCode",
"level1": "68a439bd3a4912126b6c9412",
"level2": "68a43bc2dc29c613727c9862"
},
{
"_id": "68a442fcc466711783947149",
"name": "Jack and horse mackerel (Trachurus spp.) meat, frozen.",
"code": "303550000",
"type": "hsCode",
"level1": "68a439bd3a4912126b6c9412",
"level2": "68a43bc2dc29c613727c9862"
},
{
"_id": "68a44398c4667117839475ff",
"name": "Seeds of Broad beans and horse beans",
"code": "713501000",
"type": "hsCode",
"level1": "68a439bd3a4912126b6c9412",
"level2": "68a43bc6dc29c613727c9880"
},
{
"_id": "68a448b5c466711783949ce7",
"name": "Yarn of coarse animal hair or of horsehair (including gimpe",
"code": "5110000000",
"type": "hsCode",
"level1": "68a439bd3a4912126b6c9412",
"level2": "68a43bc3dc29c613727c986b"
},
{
"_id": "68a448bac466711783949d13",
"name": "Woven fabrics of coarse animal hair or of horsehair.",
"code": "5113000000",
"type": "hsCode",
"level1": "68a439bd3a4912126b6c9412",
"level2": "68a43bc3dc29c613727c986b"
}
]
}{
"success": true,
"message": "commodities fetched Successfully",
"data": [
{
"_id": "68a44785c4667117839493c6",
"name": "Other plates, sheets, film, foil and strip, of polymers of ethylene Not printed",
"code": "3920101000",
"type": "hsCode",
"level1": "68a439bd3a4912126b6c9412",
"level2": "68a43bc4dc29c613727c986e"
},
{
"_id": "68a447b7c466711783949557",
"name": "Reinforced only with metal",
"code": "4010110000",
"type": "hsCode",
"level1": "68a439bd3a4912126b6c9415",
"level2": "68a43bc6dc29c613727c9883"
},
{
"_id": "68a447b8c46671178394955b",
"name": "Reinforced only with textile materials",
"code": "4010120000",
"type": "hsCode",
"level1": "68a439bd3a4912126b6c9415",
"level2": "68a43bc9dc29c613727c989b"
},
{
"_id": "68a447b8c46671178394955f",
"name": "Conveyor or transmission belts or beltin Other",
"code": "4010190000",
"type": "hsCode",
"level1": "68a439bd3a4912126b6c9417",
"level2": "68a43bc5dc29c613727c9877"
},
{
"_id": "68a44a4ec46671178394a932",
"name": "Mutilated rags",
"code": "6310101000",
"type": "hsCode",
"level1": "68a439be3a4912126b6c9419",
"level2": "68a439be3a4912126b6c9419"
},
{
"_id": "68a44ab1c46671178394ac20",
"name": "Ampoules of glass",
"code": "7010100000",
"type": "hsCode",
"level1": "68a439bd3a4912126b6c9417",
"level2": "68a43bc8dc29c613727c9892"
},
{
"_id": "68a44ed9c46671178394cc24",
"name": "Apparatus and equipment for automatically developing photographic film or paper in rolls",
"code": "9010100000",
"type": "hsCode",
"level1": "68a439bd3a4912126b6c9412",
"level2": "68a43bc3dc29c613727c9865"
},
{
"_id": "68a44fe8c46671178394d435",
"name": "Maize (corn) starch excluding Pharmaceutical grade",
"code": "9901101011",
"type": "hsCode",
"level1": "68a439bd3a4912126b6c9412",
"level2": "68a43bc2dc29c613727c985f"
},
{
"_id": "68a44fe9c46671178394d439",
"name": "-- Food preparations not elsewhere specified or included: Stock powder",
"code": "9901101012",
"type": "hsCode",
"level1": "68a439be3a4912126b6c9419",
"level2": "68a439be3a4912126b6c9419"
},
{
"_id": "68a44fe9c46671178394d43d",
"name": "Petroleum oils and oil obtained from bituminous mineral",
"code": "9901101013",
"type": "hsCode",
"level1": "68a439bd3a4912126b6c9412",
"level2": "68a43bc4dc29c613727c986e"
},
{
"_id": "68a44feac46671178394d441",
"name": "Prepared glues and other\tprepared adhesives",
"code": "9901101014",
"type": "hsCode",
"level1": "68a439be3a4912126b6c941b",
"level2": "68a43bcadc29c613727c989e"
},
{
"_id": "68a44feac46671178394d445",
"name": "Prepared binders for foundry moulds or cores �- Other",
"code": "9901101015",
"type": "hsCode",
"level1": "68a439be3a4912126b6c9419",
"level2": "68a439be3a4912126b6c9419"
},
{
"_id": "68a44febc46671178394d449",
"name": "-- weighing not more than 25g/m 2",
"code": "9901101016",
"type": "hsCode",
"level1": "68a439be3a4912126b6c9419",
"level2": "68a439be3a4912126b6c9419"
},
{
"_id": "68a44febc46671178394d44d",
"name": "-- weighing more than 25g/m 2 but not more than 70 g/m2",
"code": "9901101017",
"type": "hsCode",
"level1": "68a439be3a4912126b6c9419",
"level2": "68a439be3a4912126b6c9419"
},
{
"_id": "68a44fecc46671178394d451",
"name": "-- weighing more than 25g/m 2 but not more than 70 g/m2",
"code": "9901101018",
"type": "hsCode",
"level1": "68a439be3a4912126b6c9419",
"level2": "68a439be3a4912126b6c9419"
},
{
"_id": "68a44fecc46671178394d455",
"name": "-- Other : weighing not more than 25g/m 2",
"code": "9901101019",
"type": "hsCode",
"level1": "68a439be3a4912126b6c9419",
"level2": "68a439be3a4912126b6c9419"
},
{
"_id": "68a44ffbc46671178394d4c9",
"name": "--Presented completely knocked down (CKD) or unassembled for the assembly industry; CKD",
"code": "9903101011",
"type": "hsCode",
"level1": "68a439bd3a4912126b6c9412",
"level2": "68a43bc3dc29c613727c986b"
}
]
}Introduction
The OnePort BPAAS (Booking Platform as a Service) Middleware API is a RESTful integration layer that gives partner platforms programmatic access to OnePort 365's freight and logistics services.
OnePort 365 is a digital freight forwarding platform that connects shippers, exporters, and importers to carriers, freight agents, and logistics providers across Africa and global trade lanes. The BPAAS Middleware API is the bridge that lets your platform — whether a marketplace, ERP system, trade finance tool, or customs portal — embed OnePort's freight capabilities directly into your own product without building the logistics infrastructure from scratch.
Through this API, your platform can:
- Onboard users with a secure, OTP-verified registration and login flow.
- Search live freight rates across multiple carriers and lanes in real time.
- Create and confirm bookings for ocean freight shipments with full container specification.
- Manage shipments end-to-end, from creation to document uploads.
- Access reference data such as commodity types and HS codes to validate and enrich payloads.
Who This API Is For
This documentation is intended for developers integrating OnePort 365's freight services into a third-party platform. You should be comfortable working with REST APIs, JSON payloads, and HTTP Bearer Token authentication.
Base URL
All API endpoints are relative to the base URL for your target environment. Prefix every endpoint path in this documentation with the appropriate base URL.
| Environment | Base URL |
|---|---|
| Test / Staging | https://test-bpass-api.oneport365.com/api |
| Production | https://bpass-api.oneport365.com/api |
Authentication
The API uses Bearer Token authentication. Every
request — except Register and Login — must include a valid token in
the Authorization header.
Authorization: Bearer <your_token>
Tokens are obtained by completing the registration and login flow. Follow these steps before making any other API calls:
- Register — Create an account with your email, password, name, and phone. An OTP is sent to your email.
- Verify OTP — Confirm your email using the OTP. Your account is inactive until this step is completed.
- Login — Authenticate with your credentials. The response contains your bearer token.
-
Store and use the token — Include it in the
Authorizationheader on every subsequent request.
If your token expires, call Login again for a fresh one. For forgotten passwords, use the Forgot Password → Reset Password flow.
Request & Response Format
All request bodies must be sent as JSON (Content-Type: application/json), except for document uploads which use
multipart/form-data. All responses are returned as
JSON. A successful request returns a 2xx status code.
Errors return a corresponding 4xx or
5xx status with a message body.
Resource Groups
The API is organized into five groups, each covering a distinct domain of the freight workflow:
| Group | What it covers |
|---|---|
| Auth | Account registration, OTP verification, login, and password recovery |
| Bookings | Create, list, view, and confirm freight bookings |
| Shipments | Create and manage shipment records, and upload supporting documents |
| DaaS | Reference data — commodity types, HS codes, categories, and descriptions |
| Live Rates | Fetch real-time freight rates, validate pricing, and lock in a selected rate |
Typical Integration Flow
Most integrations follow this end-to-end sequence. Each step depends on data returned by the previous one.
1. Register
↓
2. Verify OTP (activates the account)
↓
3. Login → receive bearer token
↓
4. Get Live Rates (pass search_id to next steps)
↓
5. Confirm Live Rates (validate pricing in your chosen currency)
↓
6. Select Rate (locks the rate for a booking)
↓
7. Create Booking (origin, destination, container spec, cargo-ready date)
↓
8. Confirm Booking (links shipment_id and finalizes container details)
↓
9. Upload Documents (bill of lading, NXP, packing list, etc.)
Use the DaaS — Commodity Types endpoint at any point in the flow to look up valid HS codes, commodity categories, or descriptions to populate booking and shipment payloads correctly.
Key Concepts
search_id
A search_id ties together the three Live Rates calls —
Get, Confirm, and Select. It represents a single rate-search session
and must be passed as a path variable in all three endpoints.
booking_id vs shipment_id
A booking is a freight reservation — the intent to
ship. A shipment is the operational record that
tracks the cargo from origin to destination. They are linked: when
you confirm a booking, you provide a shipment_id to tie
them together.
Port Codes
Origin and destination ports are identified using
UN/LOCODE — the United Nations Code for Trade and
Transport Locations. For example, NGAPP is Apapa
(Lagos, Nigeria) and DEHAM is Hamburg, Germany.
Container Sizes & Types
Container sizes follow the standard format: 20FT,
40FT, 40HC. Container types include
dry (standard), reefer (refrigerated), and
others depending on carrier availability.
Auth
Registration, OTP verification, login and password recovery. Login returns the bearer token used across the rest of the API.
Register
Create a new account. Triggers a one-time code sent to the email for verification.
Body
| Field | Type | |
|---|---|---|
| firstname | string | required |
| lastname | string | required |
| company_name | string | required |
| company_address | string | required |
| string | required | |
| phone | string | required |
| password | string | required |
| is_agent | boolean | required |
| country_code | string | required — ISO 3166-1 alpha-2 (e.g. NG) |
| whatsapp_no | string | optional |
| registration_channel | string | optional — e.g. website |
curl --location 'https://test-bpass-api.oneport365.com/api/auth/register' \
--header 'Content-Type: application/json' \
--data '{
"firstname": "Prajjwal",
"lastname": "Soni",
"company_name": "Oneport365",
"company_address": "12 Admiralty Way, Lekki, Lagos",
"email": "[email protected]",
"phone": "+2348012345678",
"password": "Secret@123",
"is_agent": false,
"country_code": "NG",
"whatsapp_no": "+2348012345678",
"registration_channel": "website"
}'
{
"firstname": "Prajjwal",
"lastname": "Soni",
"company_name": "Oneport365",
"company_address": "12 Admiralty Way, Lekki, Lagos",
"email": "[email protected]",
"phone": "+2348012345678",
"password": "Secret@123",
"is_agent": false,
"country_code": "NG",
"whatsapp_no": "+2348012345678",
"registration_channel": "website"
}
Login
Authenticate with email and password to obtain the bearer token.
Body
| Field | Type | |
|---|---|---|
| string | required | |
| password | string | required |
{
"email": "[email protected]",
"password": "P@ssword1"
}
Forgot Password
Begin password recovery. Sends a one-time code to the account email.
{ "email": "[email protected]" }
Verify registration OTP
Confirm a newly registered account with the OTP sent to the email.
Body
| Field | Type | |
|---|---|---|
| string | required | |
| otp | string | required |
| verify_token | string | required |
{
"email": "[email protected]",
"otp": "123456",
"verify_token": "a3f8c2d1e74b9056f2a1c8d3e5b7f901"
}
Reset Password
Set a new password using the reset token from Forgot Password.
Body
| Field | Type | |
|---|---|---|
| string | required | |
| password | string | required |
| reset_token | string | required |
{
"email": "[email protected]",
"password": "12344",
"reset_token": "Vk93xR2mTpL8qZjN"
}
Bookings
List, view, create and confirm freight bookings for the authenticated account.
My Bookings
List bookings for the authenticated account, paginated.
Query parameters
| Param | Type | Default |
|---|---|---|
| page | integer | 0 |
| count | integer | 15 |
curl --location 'https://test-bpass-api.oneport365.com/api/bookings/my-bookings?page=0&count=15' \
--header 'Authorization: Bearer $TOKEN'
Booking Details
Retrieve the full record for a single booking.
Path variables
| Variable | Type | |
|---|---|---|
| booking_id | string | required |
Booking Summary
Retrieve a condensed summary of a single booking.
Path variables
| Variable | Type | |
|---|---|---|
| booking_id | string | required |
Create Booking
Create a booking for a lane with container and cargo-readiness details.
Body
| Field | Type | |
|---|---|---|
| shipment_type | string | required |
| shipment_transport_type | string | required |
| origin_port_code | string | required |
| destination_port_code | string | required |
| cargo_pickup_date | string (ISO 8601) | required |
| cargo_ready_date | string (ISO 8601) | required |
| container_details | array<object> | required |
| goods_value | string | required |
| goods_value_currency | string |
required — ISO 4217 (e.g.
NGN)
|
| goods_type | string | required |
| is_product_hazardous | boolean | required |
| with_haulage | boolean | required |
| ocean_freight_type | string |
required — when
shipment_transport_type is
ocean_freight
|
Each item in container_details carries:
commodity_hs_code, commodity_type,
commodity_category,
commodity_description, container_count,
container_size, container_type,
container_weight, ocean_freight_type.
{
"shipment_type": "export",
"shipment_transport_type": "ocean_freight",
"origin_port_code": "NGAPP",
"destination_port_code": "ESLEI",
"cargo_pickup_date": "2026-11-22T11:43:28.165Z",
"cargo_ready_date": "2026-11-22T11:43:28.165Z",
"container_details": [
{
"commodity_hs_code": "101900000",
"commodity_type": "Agro Commodities",
"commodity_category": "Livestock & Animals",
"commodity_description": "Live Mules and hinnies",
"container_count": 1,
"container_size": "20FT",
"container_type": "dry",
"container_weight": 500,
"ocean_freight_type": "FCL"
}
],
"goods_value": "1000",
"goods_value_currency": "NGN",
"goods_type": "Sesame Seeds",
"is_product_hazardous": false,
"with_haulage": false,
"ocean_freight_type": "FCL"
}
Confirm Booking
Confirm a booking against a shipment and its container details.
Body
| Field | Type | |
|---|---|---|
| shipment_id | string | required |
| shipment_transport_type | string | required |
| ocean_freight_type | string |
required — when
shipment_transport_type is
ocean_freight
|
| container_details | array<object> | required |
| incoterms | array<string> |
required — e.g.
["FOB"]
|
| cargo_ready_date | string (YYYY-MM-DD) | required |
| with_haulage | boolean | required |
| with_tracker | boolean | required |
| goods_type | string | required |
| goods_value | string | required |
| goods_value_currency | string |
required — ISO 4217 (e.g.
USD)
|
Each item in container_details carries:
container_count, container_type,
container_size, container_weight,
commodity_type, commodity_category,
commodity_description.
{
"shipment_id": "665f1c9a2b4d8e0012ab34cd",
"shipment_transport_type": "ocean_freight",
"ocean_freight_type": "FCL",
"container_details": [
{
"container_count": 2,
"container_type": "dry",
"container_size": "40FT",
"container_weight": 18,
"commodity_type": "general_cargo",
"commodity_category": "general",
"commodity_description": "Ceramic tiles"
}
],
"incoterms": ["FOB"],
"cargo_ready_date": "2026-08-10",
"with_haulage": false,
"with_tracker": false
}
Shipments
List and view shipments, create them, and upload supporting documents.
My Shipments
List shipments for the authenticated account, paginated.
Query parameters
| Param | Type | Default |
|---|---|---|
| page | integer | 0 |
| count | integer | 10 |
curl --location 'https://test-bpass-api.oneport365.com/api/shipments/my-shipments?page=0&count=10' \
--header 'Authorization: Bearer $TOKEN'
Shipment Details
Retrieve the full record for a single shipment.
Path variables
| Variable | Type | |
|---|---|---|
| shipment_id | string | required |
Upload Document
Attach a document to a shipment. Sent as
multipart/form-data.
Path variables
| Variable | Type | |
|---|---|---|
| shipment_id | string | required |
Form-data fields
| Field | Type | Example |
|---|---|---|
| shipment_file | file | @/path/to/file |
| document_name | string | nxp_document |
| document_type | string | main |
curl --location 'https://test-bpass-api.oneport365.com/api/shipments/upload-document/:shipment_id' \
--header 'Authorization: Bearer $TOKEN' \
--form 'shipment_file=@"/path/to/file"' \
--form 'document_name="nxp_document"' \
--form 'document_type="main"'
DaaS
Reference data used when building bookings and shipments.
Commodity Types
Look up commodity reference data, filtered by HS code, type, category and description.
Query parameters
| Param | Type | Example |
|---|---|---|
| hs_code | string | 104201 |
| commodity_type | string | Agro Commodities |
| commodity_category | string | Rice |
| commodity_description | string | oilcake |
curl --location 'https://test-bpass-api.oneport365.com/api/daas/commodity-types?hs_code=104201&commodity_type=Agro%20Commodities&commodity_category=Rice&commodity_description=oilcake' \
--header 'Authorization: Bearer $TOKEN'
Live Rates
Retrieve live rate results for a search, confirm them, and select one to carry into a booking.
Get Live Rates
Retrieve live rate results for a prior rate search.
Path variables
| Variable | Type | |
|---|---|---|
| shipment_id | string | required |
Query parameters
| Param | Type | Example |
|---|---|---|
| type | string | lowest_prices |
| is_agent | boolean | true |
curl --location 'https://test-bpass-api.oneport365.com/api/live-rates/get/:shipment_id?type=lowest_prices&is_agent=true' \
--header 'Authorization: Bearer $TOKEN'
Confirm Live Rates
Confirm a rate result for a search before selecting it.
Path variables
| Variable | Type | |
|---|---|---|
| search_id | string | required |
Body
| Field | Type | |
|---|---|---|
| instant_result_id | string | required |
| rates_currency | string | required |
{
"instant_result_id": "63b53f593e411699769e59b4",
"rates_currency": "NGN"
}
Select Rate
Select a specific rate result to carry into a booking.
Path variables
| Variable | Type | |
|---|---|---|
| search_id | string | required |
Body
| Field | Type | |
|---|---|---|
| rate_result_id | string | required |
| currency | string | required |
{
"rate_result_id": "65bcfad4552ad0567483d199",
"currency": "NGN"
}