Documentation
Documentation
https://docs.okcapsule.app/docs/
APIReference
https://api2-docs.okcapsule.app/
GettingStarted
https://docs.okcapsule.app/docs/getting-started
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/ok-capsule-clients-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
openapi: 3.2.0
info:
description: '## Overview
The OK Capsule API enables you to programmatically create supplement orders, manage consumers, and track shipments. It is a REST API that accepts JSON requests, returns JSON responses, and uses standard HTTP methods and status codes.
**All requests must be made over HTTPS.**
📚 **Additional Resources:** [Getting Started Guide](https://docs.okcapsule.app/docs/getting-started) | [Recipes & Examples](https://docs.okcapsule.app/docs/category/recipes)
## Getting Started
> **New to OK Capsule API?** Account and brand setup must be completed before contacting OK Capsule about API credentials. If you have not set up your account and brand yet, start with the [Getting Started Guide](https://docs.okcapsule.app/docs/getting-started) before proceeding.
1. **Set up your account** - Your OK Capsule account must be created and active
2. **Set up your brand** - At least one Product Line must be configured in your account
3. **Contact OK Capsule about API credentials** - Reach out to your OK Capsule representative once account and brand setup are complete
4. **Authenticate** - POST to `/v2/authentication/token` to get an access token
5. **List products** - GET `/v2/products` to see available supplements
6. **Create an order** - POST to `/v2/orders` with consumer and product details
7. **Track fulfillment** - Monitor order status and shipping via `/v2/orders` and `/v2/fulfillments`
## Environments
| Environment | Purpose | Notes |
|-------------|---------|-------|
| **Production** | Live orders | Real fulfillment and shipping |
| **Stage** | Testing | Test data only, no real shipments |
⚠️ Users and data are environment-specific. Stage credentials do not work in Production.
## Core Concepts
| Term | Route | Description |
|------|-------|-------------|
| **Client** | `/v2/clients` | Your organization (business partner submitting orders) |
| **Consumer** | `/v2/consumers` | Your end customer who receives supplements |
| **Product** | `/v2/products` | A client-specific instance of an OKC Product with custom branding |
| **Order** | `/v2/orders` | A request to fulfill supplements for a consumer |
| **Order Line** | — | A set of pouches within an order (e.g., 30-day supply) |
| **Pouch** | — | An individual daily packet of supplements |
| **Fulfillment** | `/v2/fulfillments` | Shipping, tracking, and delivery information for an order |
| **Assembly** | `/v2/assemblies` | A client''s predefined bundle of products (commonly called a "pack") |
| **Product Line** | `/v2/product-lines` | A client''s marketing brand (appears on packaging) |
| **OKC Product** | — | A supplement in the OK Capsule master catalog (what OKC purchases from vendors) |
| **User** | `/v2/users` | An authorized person who accesses the API or portal |
| **Contact** | `/v2/contacts` | A person associated with a client, managed for communication purposes |'
version: 2.0.0
title: OKC core API V2 Clients API
contact:
name: Engineering Department, OKCapsule
email: lukas@okcapsule.com
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- description: Production environment
url: https://na1-prod.okcapsule.app
- description: Stage/Testing environment
url: https://na1-stage.okcapsule.app
tags:
- name: Clients
description: Routes to manage clients
paths:
/v2/clients:
post:
tags:
- Clients
security:
- bearerAuth:
- clients/write
summary: Creates a client.
operationId: createClient
description: Creates a client record.
requestBody:
content:
application/json:
schema:
type: object
required:
- business_name
properties:
business_name:
type: string
example: Incorporated Company, LLC.
display_name:
type: string
example: My Company
is_test_account:
type: boolean
example: false
is_international_shipping_enabled:
type: boolean
example: false
onboarding_stage:
type:
- string
- 'null'
enum:
- signup
- verification
- introduction
- brand
- contacts
- addresses
- payment
- install_shopify
- formulary
- solution_packs
- pamphlet
- labels
- packet
- product_spec
- terms
- sla_rules
- test_order
- complete
- login
- confirmation_redirect
example: signup
service_level:
type: string
enum:
- Starter
- Professional
- Enterprise
default: Starter
example: Starter
contract_type:
type: string
enum:
- T&C
- MSA
default: T&C
example: T&C
admin_user:
type: object
required:
- name
- email
properties:
name:
type: string
example: Example Tester
email:
type: string
format: email
example: user@example.com
phone_number:
type: string
example: '+16175551212'
locale:
type: string
pattern: ^[a-z]*-[A-Z]{2}$
example: en-US
address:
type: object
description: Optional initial address for the client
properties:
is_default:
type: boolean
example: true
address_type:
type: string
enum:
- shipping
- billing
- legal
- return
example: billing
addressed_to:
type: string
maxLength: 35
address1:
type: string
maxLength: 100
example: 742 Evergreen Terrace
address2:
type: string
maxLength: 100
city:
type: string
maxLength: 50
example: Springfield
province_name:
type: string
maxLength: 30
country_name:
type: string
example: United States
postal_code:
type: string
maxLength: 10
phone_number:
type: string
maxLength: 15
is_brand_remap_enabled:
type: boolean
default: false
example: false
description: When enabled, allows brand remapping for this client's products.
status:
type: string
enum:
- Active
- Inactive
- Onboarding
default: Onboarding
x-internal: true
description: Internal use only - defaults to Onboarding.
user_type:
type: string
enum:
- client
- internal
x-internal: true
description: Internal use only.
max_user_count:
type: integer
minimum: 1
example: 5
x-internal: true
description: Internal use only - filtered out for client users.
crm_account_id:
type: string
example: ABCDabcd123
x-internal: true
description: Internal use only - filtered out for client users.
examples:
ClientFullSample:
$ref: '#/components/examples/ClientFullSample'
ClientRequiredSample:
$ref: '#/components/examples/ClientRequiredSample'
responses:
'201':
description: Returns a created Client object.
content:
application/json:
schema:
type: object
properties:
client:
$ref: '#/components/schemas/Client'
admin_user:
$ref: '#/components/schemas/User'
'422':
$ref: '#/components/responses/422ValidationError'
default:
$ref: '#/components/responses/UnknownError'
get:
tags:
- Clients
security:
- bearerAuth:
- clients/read
summary: List all clients.
operationId: listClients
description: "List all clients a user has access to.\n\nFilterable fields:\n * status\n * business_name\n * display_name\n * crm_id\n\nSortable fields:\n* display_name\n* business_name\n"
parameters:
- $ref: '#/components/parameters/LimitParameters'
- $ref: '#/components/parameters/CursorParameters'
- $ref: '#/components/parameters/SortByParameters'
- $ref: '#/components/parameters/QueryParameters'
responses:
'200':
description: Search results matching criteria
content:
application/json:
schema:
required:
- clients
properties:
clients:
type: array
items:
$ref: '#/components/schemas/Client'
default:
$ref: '#/components/responses/UnknownError'
/v2/clients/{id}:
get:
tags:
- Clients
security:
- bearerAuth:
- clients/read
summary: Retrieve a client.
operationId: getClient
description: Retrieves a client by id.
parameters:
- $ref: '#/components/parameters/IdParameter'
responses:
'200':
description: Returns the Client object for a valid identifier.
content:
application/json:
schema:
type: object
properties:
client:
$ref: '#/components/schemas/Client'
default:
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorModel'
description: Error response.
put:
tags:
- Clients
security:
- bearerAuth:
- clients/write
summary: Update a client.
operationId: updateClient
description: Update Client object.
parameters:
- $ref: '#/components/parameters/IdParameter'
requestBody:
content:
application/json:
schema:
type: object
properties:
business_name:
type: string
example: Incorporated Company, LLC.
display_name:
type: string
example: My Company
crm_account_id:
type: string
example: ABCDabcd123
x-internal: true
description: Internal use only - filtered out for client users.
status:
type: string
enum:
- Active
- Inactive
- Onboarding
example: Active
x-internal: true
description: Internal use only - filtered out for client users.
onboarding_stage:
type:
- string
- 'null'
enum:
- signup
- verification
- introduction
- brand
- contacts
- addresses
- payment
- install_shopify
- formulary
- solution_packs
- pamphlet
- labels
- packet
- product_spec
- terms
- sla_rules
- test_order
- complete
- login
- confirmation_redirect
- billing_address
- packaging
- product_customization
- categories
- creating_drafts
- shipping_tracking
example: signup
max_user_count:
type: integer
minimum: 0
example: 5
x-internal: true
description: Internal use only - filtered out for client users.
is_test_account:
type: boolean
example: false
is_international_shipping_enabled:
type: boolean
example: false
tax_id:
type: string
example: 001-999-874
business_contact_firstname:
type: string
example: John
business_contact_lastname:
type: string
example: Doe
business_contact_email:
type: string
format: email
example: johndoe@email.com
billing_contact_firstname:
type: string
example: Jane
billing_contact_lastname:
type: string
example: Smith
billing_contact_address_id:
type: string
format: uuid
example: dc6fcff9-0464-4c03-9bb9-e90812361a66
service_level:
type: string
enum:
- Starter
- Professional
- Enterprise
example: Starter
contract_type:
type: string
enum:
- T&C
- MSA
example: T&C
stripe_customer_id:
type: string
example: cus_abc123
payment_session_id:
type:
- string
- 'null'
example: pi_abc123
is_brand_remap_enabled:
type: boolean
example: false
description: When enabled, allows brand remapping for this client's products.
responses:
'200':
description: Returns the updated client.
content:
application/json:
schema:
type: object
properties:
client:
$ref: '#/components/schemas/Client'
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/ValidationError'
description: Validation error response.
default:
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorModel'
description: Error response.
delete:
tags:
- Clients
security:
- bearerAuth:
- clients/write
summary: Delete a client.
operationId: deleteClient
description: Delete a Client object.
parameters:
- $ref: '#/components/parameters/IdParameter'
responses:
'204':
description: Confirms deletion of a client.
default:
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorModel'
description: Error response.
components:
parameters:
SortByParameters:
in: query
name: sort_by
description: Sort values by a specific property. See available sort by values in the table.
schema:
type: string
QueryParameters:
in: query
name: q
description: Use Query DSL *query_string* syntax
schema:
type: string
LimitParameters:
in: query
name: limit
description: Number of results to return. Default 50, max 250.
required: false
schema:
type: integer
minimum: 1
maximum: 250
CursorParameters:
in: query
name: cursor
description: Return results before/after a specific record.
schema:
type: string
IdParameter:
in: path
name: id
required: true
schema:
type: string
minimum: 1
examples:
ClientRequiredSample:
summary: Create client with only required fields.
value:
business_name: Incorporated Company, LLC
ClientFullSample:
summary: Create client with all the fields.
value:
business_name: Incorporated Company, LLC
display_name: My Company
is_test_account: false
admin_user:
name: Example Tester
email: user@example.com
phone_number: '16175551212'
locale: en-US
responses:
422ValidationError:
description: Validation error response.
content:
application/json:
schema:
type: object
title: Validation Error
required:
- message
- errors
description: A validation error response from the OK Capsule API (Joi validation)
properties:
message:
description: A human-readable message indicating a validation error occurred.
maxLength: 40000
type: string
example: Validation error
errors:
description: An array of validation errors from Joi schema validation
type: array
items:
type: object
required:
- message
- type
properties:
message:
description: A human-readable message providing more details about the validation error.
type: string
example: '''business_name'' is required'
type:
description: The Joi validation type that failed.
type: string
example: any.required
UnknownError:
description: Error response.
content:
application/json:
schema:
title: Error Model
description: An error response from the OK Capsule API
type: object
properties:
error:
title: Error Model Content
type: object
description: Error details object
required:
- message
properties:
errorCode:
description: For some errors that could be handled programmatically, a short string indicating the error code.
maxLength: 5000
type: string
example: RESOURCE_NOT_FOUND
message:
description: A human-readable message providing more details about the error.
maxLength: 40000
type: string
example: The requested resource was not found
message:
description: Top-level error message (present in some error responses)
type: string
example: Internal Server Error
required:
- error
schemas:
ValidationError:
type: object
title: Validation Error
required:
- message
- errors
description: A validation error response from the OK Capsule API (Joi validation)
properties:
message:
description: A human-readable message indicating a validation error occurred.
maxLength: 40000
type: string
example: Validation error
errors:
description: An array of validation errors from Joi schema validation
type: array
items:
type: object
required:
- message
- type
properties:
message:
description: A human-readable message providing more details about the validation error.
type: string
example: '''business_name'' is required'
type:
description: The Joi validation type that failed.
type: string
example: any.required
Client:
allOf:
- allOf:
- type: object
required:
- created_at
- updated_at
properties:
created_at:
type: string
format: date-time
readOnly: true
example: '2023-03-20T09:12:28Z'
updated_at:
type: string
format: date-time
readOnly: true
example: '2023-03-20T09:12:28Z'
- type: object
required:
- id
- status
- business_name
properties:
id:
type: string
readOnly: true
format: uuid
example: d290f1ee-6c54-4b01-90e6-d701748f0851
status:
type: string
enum:
- Active
- Inactive
- Onboarding
example: Active
onboarding_stage:
type:
- string
- 'null'
enum:
- signup
- verification
- introduction
- brand
- contacts
- addresses
- payment
- install_shopify
- formulary
- solution_packs
- pamphlet
- labels
- packet
- product_spec
- terms
- sla_rules
- test_order
- complete
- login
- confirmation_redirect
- billing_address
- packaging
- product_customization
- categories
- creating_drafts
- shipping_tracking
example: signup
business_name:
type: string
example: Incorporated Company, LLC
display_name:
type: string
example: My Company
tax_id:
type: string
example: 001-999-874
business_contact_firstname:
type: string
example: John
business_contact_lastname:
type: string
example: Doe
business_contact_email:
type: string
example: johndoe@email.com
billing_contact_firstname:
type: string
example: Jane
billing_contact_lastname:
type: string
example: Smith
billing_contact_address_id:
type: string
format: uuid
example: dc6fcff9-0464-4c03-9bb9-e90812361a66
is_test_account:
type: boolean
example: false
is_international_shipping_enabled:
type: boolean
example: false
max_user_count:
type: integer
example: 5
service_level:
type: string
enum:
- Starter
- Professional
- Enterprise
example: Starter
contract_type:
type: string
enum:
- T&C
- MSA
example: T&C
stripe_customer_id:
type: string
example: cus_abc123
payment_session_id:
type: string
example: ps_abc123
is_brand_remap_enabled:
type: boolean
default: false
example: false
description: When enabled, allows brand remapping for this client's products.
crm_account_id:
type: string
x-internal: true
description: Internal use only.
example: ABCDabcd123
crm_id:
type: string
x-internal: true
description: Internal use only.
example: ABCDE12587AHSNNHS
- type: object
required:
- created_at
- updated_at
properties:
created_at:
type: string
format: date-time
readOnly: true
example: '2023-03-20T09:12:28Z'
updated_at:
type: string
format: date-time
readOnly: true
example: '2023-03-20T09:12:28Z'
ErrorModel:
title: Error Model
description: An error response from the OK Capsule API
type: object
properties:
error:
title: Error Model Content
type: object
description: Error details object
required:
- message
properties:
errorCode:
description: For some errors that could be handled programmatically, a short string indicating the error code.
maxLength: 5000
type: string
example: RESOURCE_NOT_FOUND
message:
description: A human-readable message providing more details about the error.
maxLength: 40000
type: string
example: The requested resource was not found
message:
description: Top-level error message (present in some error responses)
type: string
example: Internal Server Error
required:
- error
User:
allOf:
- type: object
required:
- id
- client_id
properties:
id:
type: string
format: uuid
readOnly: true
example: d290f1ee-6c54-4b01-90e6-d701748f0851
client_id:
type:
- string
- 'null'
format: uuid
example: d290f1ee-6c54-4b01-90e6-d701748f0851
user_type:
type: string
enum:
- client
- internal
example: client
name:
type: string
example: John Doe
username:
type: string
format: uuid
readOnly: true
example: 087078ea-4b50-4a46-bb4d-322cf17db3ca
description: Same as id (Cognito sub)
email:
type: string
format: email
example: user@example.com
locale:
type:
- string
- 'null'
example: en-US
roles:
type: array
items:
type: string
enum:
- Client_Admin
- Client_Manager
- Client_Developer
- Client_User
- Internal_Admin
- Internal_Manager
- Internal_Developer
- Internal_User
example:
- Client_Manager
- Client_Developer
phone_number:
type:
- string
- 'null'
format: E.164
example: 12133734253
last_login:
type:
- string
- 'null'
format: date-time
readOnly: true
example: '2023-06-29T11:12:28Z'
- type: object
required:
- created_at
- updated_at
properties:
created_at:
type: string
format: date-time
readOnly: true
example: '2023-03-20T09:12:28Z'
updated_at:
type: string
format: date-time
readOnly: true
example: '2023-03-20T09:12:28Z'
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT