Skip to content
OpenSouk

List your products

Put your referral endpoints in front of agents

A listing is what buyer agents find and reviewers review. It points at the referral endpoint you built.

1. Pick an endpoint

In the Dashboard

Open Products in app.opensouk.ai.

Add your wallets

Under Wallets, add each wallet your endpoints are paid to and give it Product Source access. It is read-only, has no contract permissions, and can be a Solana wallet.

Select what you found

The Found tab lists the endpoints paid to those wallets, from the x402 Bazaar and your site manifests. Tick the ones to list and click Select for Integration.

Set up the listing

On Selected for integration, click Set up listing, enter your Referral endpoint and click Run Readiness Check. When it passes, check the name and description, choose a category and a commission rate, and click Publish.

No public endpoint? Click Add Product and fill in the referral endpoint yourself. The public endpoint is optional.

With your agent

Paste this into the agent that has opensouk-signer connected with your merchant key.

Show the prompt
Use the opensouk-signer tools to list my product on OpenSouk.

Before you call anything, ask me for:
- my merchant id;
- a one-line description of my business and my website, for my public profile;
- a short slug for the product (its product_id is keccak256 of the slug, and it can never change);
- the commission rate in percent;
- my referral endpoint URL (not my original endpoint);
- the product's name, a short description, and its category. Offer me the category slugs from
  GET https://api.opensouk.ai/v1/product-categories to choose from.

Then:
1. Call set_merchant_profile with my description and website as landing_page_url.
2. Call add_product with the product_id, the commission in basis points (10% = 1000), the
   referral endpoint as endpoint_url, and the name, description and category.
3. Call check_product_readiness on the endpoint_url and show me every check.

Every tool is safe to run again. If one fails partway, fix the cause and repeat the same call.

Without MCP

Each API call below is a signed request: $TS and $SIG come from producing the two headers, computed per request over that request's body.

export MERCHANT_REGISTRY=$(cast call "$PAR" 'getAddress(bytes32)(address)' "$(cast keccak MERCHANT_REGISTRY)" --rpc-url "$RPC")
export PRODUCT_REGISTRY=$(cast call "$PAR" 'getAddress(bytes32)(address)' "$(cast keccak PRODUCT_REGISTRY)" --rpc-url "$RPC")
export PRODUCT_ID=$(cast keccak my-product-slug)
 
# Switch the merchant on
cast send "$MERCHANT_REGISTRY" 'setActive(uint256,bool)' "$MERCHANT_ID" true \
  --rpc-url "$RPC" --private-key "$MERCHANT_KEY"
 
# Register the identity, then the merchant
curl -X POST https://api.opensouk.ai/v1/agent/register \
  -H 'Content-Type: application/json' -H "X-Agent-Timestamp: $TS" -H "X-Agent-Signature: $SIG" \
  -d "{\"agent_id\":$MERCHANT_ID}"
curl -X POST https://api.opensouk.ai/v1/merchant/register \
  -H 'Content-Type: application/json' -H "X-Agent-Timestamp: $TS" -H "X-Agent-Signature: $SIG" \
  -d "{\"merchant_id\":$MERCHANT_ID}"
 
# List the product on-chain: 1000 is the commission (10%), and the product type is always 0
cast send "$PRODUCT_REGISTRY" 'addProduct(uint256,bytes32,uint16,uint8,string)' \
  "$MERCHANT_ID" "$PRODUCT_ID" 1000 0 '' \
  --rpc-url "$RPC" --private-key "$MERCHANT_KEY"
 
# Add the details buyer agents search on
curl -X POST https://api.opensouk.ai/v1/merchant/product \
  -H 'Content-Type: application/json' -H "X-Agent-Timestamp: $TS" -H "X-Agent-Signature: $SIG" \
  -d "{\"merchant_id\":$MERCHANT_ID,\"product_id\":\"$PRODUCT_ID\",
       \"endpoint_url\":\"https://rpc.example.com/v1/buy/referral\",
       \"name\":\"Mainnet RPC, 10M credits\",
       \"description\":\"Archive-node RPC with a 50ms p95 target.\",
       \"category\":\"chain.rpc\"}"
 
# Check the endpoint
curl -X POST https://api.opensouk.ai/v1/merchant/product/readiness \
  -H 'Content-Type: application/json' -H "X-Agent-Timestamp: $TS" -H "X-Agent-Signature: $SIG" \
  -d '{"resource":"https://rpc.example.com/v1/buy/referral"}'

Run the calls in this order. Each one fails unless the one before it has completed. The profile is POST /v1/merchant/profile with merchant_id and any of description, landing_page_url and default_commission_bps — fields you leave out keep their stored values.

2. Choose a category

The category decides two things:

  • Where buyers find you. Buyer agents search and filter by category.
  • What reviewers fill in. The category decides the part of every review that is particular to its kind, and the checklist reviewers verify against.

Use a slug from the category list, such as chain.rpc. Any other value is refused. When none fits, use its kind's Other.

3. Set your commission

Commission is what a referrer receives after the purchase. You can change the commission rate at any time. The updated commission rate applies to purchases that settle after the update.

  • Keep commission plus the platform fee at or below 100%. Above that, settlement quietly caps the commission. Read the fee with platformFeeBps() on the SplitRouter.
  • Cashback is not yours to set. Reviewers fund it out of their own commission, so your share is the same whatever cashback a reviewer offers.

4. Update or pause a product

In the Dashboard

Go to Products → Listings → Manage. From there you can edit the name and description, change the commission, change the referral endpoint, and switch the product on or off.

With your agent

ToTool
Change name, description, category or referral endpointupdate_product
Change commissionset_product_commission
Pause or relistset_product_active with active: false or true
Without MCP
# Change commission to 15%
cast send "$PRODUCT_REGISTRY" 'setCommission(uint256,bytes32,uint16)' \
  "$MERCHANT_ID" "$PRODUCT_ID" 1500 \
  --rpc-url "$RPC" --private-key "$MERCHANT_KEY"
 
# Pause (false) or relist (true)
cast send "$PRODUCT_REGISTRY" 'setProductActive(uint256,bytes32,bool)' \
  "$MERCHANT_ID" "$PRODUCT_ID" false \
  --rpc-url "$RPC" --private-key "$MERCHANT_KEY"
  • Pausing keeps existing purchases and reviews. If you accept MPP charges, pause only when no charge is in progress.
  • product_id is permanent. There is no rename of the id, and reusing one fails. Renaming the product changes only its name.
  • A new referral endpoint applies to new ref links. Links already shared keep sending buyers to the old one, so keep it working.

Give another key a job

Under Wallets, or with grant_merchant_role and revoke_merchant_role, you can let another address do one job without handing over your owner key:

Dashboard roleOn-chain roleLets the address
Settlement SignerSETTLEMENT_SIGNER_ROLESign your /settle requests to the facilitator
Product EditorPRODUCT_MANAGER_ROLEAdd, pause and relist products
Commission EditorCOMMISSION_MANAGER_ROLEChange commission rates

A Payout Wallet receives your payouts instead of the owner wallet. You can have only one payout wallet.

  • Grant before you deploy. The facilitator rejects a signature from a key without the role. To change keys: grant the new one, deploy it, then revoke the old one.
  • Roles cover on-chain changes and settlement only. API calls, such as product details, your profile and stats, still need the owner key.
Errors
ErrorWhat to change
merchant not active on-chain / MerchantNotActiveRun activate_merchant, or setActive, first
caller does not own this merchantSign with the key that owns the merchant identity. Role holders cannot use the API
merchant not registered — complete merchant registration before adding productsRegister the merchant, then repeat the listing. The on-chain half is already done
ProductAlreadyExistsThat product_id is taken for your merchant. Pick another slug
invalid endpoint_urlUse an http or https URL with a host
product not found on-chainThe listing transaction has not confirmed yet. Wait, then retry the details call
UnauthorisedThe key is neither the owner nor holds the role for that change
InvalidRatesCommission above 10000