Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .spec-sha256
Original file line number Diff line number Diff line change
@@ -1 +1 @@
d95f1962bb73a3e9792c2de01bd086edce7d3c1371ece42f7c4f12032cd29e17
06a7c92e23df7c44f8898a2b18abec43aa5c14b8f12ea10e1ce65a94a14a0fb4
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,14 @@ for favorite in client.favorites.iter(item_id=42): # the buyers who favorited a
client.conversations.list(buyer_id="<buyer id>", offer_status="PENDING") # buyer_id, item_id and offer_status filter the conversations

# Writes (API key with `items:write` / `conversations:write`); `idempotency_key=` chooses the key.
from datetime import datetime, timezone

from controlresell.generated.models import ItemCreateRequest, ItemUpdateRequest, PublishRequest, SendMessageRequest

client.items.create(ItemCreateRequest(name="Jacket")) # client.items.update(42, ItemUpdateRequest(...)) patches

client.items.publish(42, PublishRequest(account_ids=["<account id>"]))
client.items.publish(42, PublishRequest(account_ids=["<account id>"], scheduled_at=datetime(2026, 11, 2, 10, 0, tzinfo=timezone.utc))) # publish, price_drop and republish take an optional scheduled_at, at most 30 days ahead; without it they run now
client.conversations.send_message("<conversation id>", SendMessageRequest(text="Hello!"))

# Webhooks (`webhooks:read` / `webhooks:write`): endpoints, endpoint, create_endpoint, update_endpoint, delete_endpoint,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,11 @@ def sync_detailed(
the buyer's identifier on the marketplace (a conversation's `buyerId`); `itemId` keeps the
conversations about the item, through their transactions on the marketplace (a conversation the
marketplace ties to no listing of the item is not found); `offerStatus` keeps those with at least
one offer currently at that status, and with `itemId` that same offer is on the item. An `itemId`
that is not one of the seller's items answers an empty page. Requires `conversations:read`.
one offer currently at that status; with `itemId`, that offer is on the item through its own
transaction, and an offer with no transaction of its own counts when the conversation's transactions
carry the item (so the result is approximate for such an offer: it can be an offer about another
item of the same conversation). An `itemId` that is not one of the seller's items answers an empty
page. Requires `conversations:read`.

Args:
limit (int | Unset): Default: 50.
Expand Down Expand Up @@ -207,8 +210,11 @@ def sync(
the buyer's identifier on the marketplace (a conversation's `buyerId`); `itemId` keeps the
conversations about the item, through their transactions on the marketplace (a conversation the
marketplace ties to no listing of the item is not found); `offerStatus` keeps those with at least
one offer currently at that status, and with `itemId` that same offer is on the item. An `itemId`
that is not one of the seller's items answers an empty page. Requires `conversations:read`.
one offer currently at that status; with `itemId`, that offer is on the item through its own
transaction, and an offer with no transaction of its own counts when the conversation's transactions
carry the item (so the result is approximate for such an offer: it can be an offer about another
item of the same conversation). An `itemId` that is not one of the seller's items answers an empty
page. Requires `conversations:read`.

Args:
limit (int | Unset): Default: 50.
Expand Down Expand Up @@ -267,8 +273,11 @@ async def asyncio_detailed(
the buyer's identifier on the marketplace (a conversation's `buyerId`); `itemId` keeps the
conversations about the item, through their transactions on the marketplace (a conversation the
marketplace ties to no listing of the item is not found); `offerStatus` keeps those with at least
one offer currently at that status, and with `itemId` that same offer is on the item. An `itemId`
that is not one of the seller's items answers an empty page. Requires `conversations:read`.
one offer currently at that status; with `itemId`, that offer is on the item through its own
transaction, and an offer with no transaction of its own counts when the conversation's transactions
carry the item (so the result is approximate for such an offer: it can be an offer about another
item of the same conversation). An `itemId` that is not one of the seller's items answers an empty
page. Requires `conversations:read`.

Args:
limit (int | Unset): Default: 50.
Expand Down Expand Up @@ -330,8 +339,11 @@ async def asyncio(
the buyer's identifier on the marketplace (a conversation's `buyerId`); `itemId` keeps the
conversations about the item, through their transactions on the marketplace (a conversation the
marketplace ties to no listing of the item is not found); `offerStatus` keeps those with at least
one offer currently at that status, and with `itemId` that same offer is on the item. An `itemId`
that is not one of the seller's items answers an empty page. Requires `conversations:read`.
one offer currently at that status; with `itemId`, that offer is on the item through its own
transaction, and an offer with no transaction of its own counts when the conversation's transactions
carry the item (so the result is approximate for such an offer: it can be an offer about another
item of the same conversation). An `itemId` that is not one of the seller's items answers an empty
page. Requires `conversations:read`.

Args:
limit (int | Unset): Default: 50.
Expand Down
32 changes: 16 additions & 16 deletions src/controlresell/generated/api/items/drop_item_price.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,10 @@ def sync_detailed(
) -> Response[ErrorResponse | ScheduledAction]:
"""Lower the price of an item's listings

Schedules a price drop of the item's existing listings, now, like the price drop of the app: the
listings are updated, not republished. `value` is what is removed from each listing's current price,
never the new price. Without `accountIds`, every account the item is online on. Requires
`items:write` and an `Idempotency-Key`.
Schedules a price drop of the item's existing listings, now or at `scheduledAt` (at most 30 days
ahead), like the price drop of the app: the listings are updated, not republished. `value` is what
is removed from each listing's current price, never the new price. Without `accountIds`, every
account the item is online on. Requires `items:write` and an `Idempotency-Key`.

Args:
id (int):
Expand Down Expand Up @@ -158,10 +158,10 @@ def sync(
) -> ErrorResponse | ScheduledAction | None:
"""Lower the price of an item's listings

Schedules a price drop of the item's existing listings, now, like the price drop of the app: the
listings are updated, not republished. `value` is what is removed from each listing's current price,
never the new price. Without `accountIds`, every account the item is online on. Requires
`items:write` and an `Idempotency-Key`.
Schedules a price drop of the item's existing listings, now or at `scheduledAt` (at most 30 days
ahead), like the price drop of the app: the listings are updated, not republished. `value` is what
is removed from each listing's current price, never the new price. Without `accountIds`, every
account the item is online on. Requires `items:write` and an `Idempotency-Key`.

Args:
id (int):
Expand Down Expand Up @@ -193,10 +193,10 @@ async def asyncio_detailed(
) -> Response[ErrorResponse | ScheduledAction]:
"""Lower the price of an item's listings

Schedules a price drop of the item's existing listings, now, like the price drop of the app: the
listings are updated, not republished. `value` is what is removed from each listing's current price,
never the new price. Without `accountIds`, every account the item is online on. Requires
`items:write` and an `Idempotency-Key`.
Schedules a price drop of the item's existing listings, now or at `scheduledAt` (at most 30 days
ahead), like the price drop of the app: the listings are updated, not republished. `value` is what
is removed from each listing's current price, never the new price. Without `accountIds`, every
account the item is online on. Requires `items:write` and an `Idempotency-Key`.

Args:
id (int):
Expand Down Expand Up @@ -231,10 +231,10 @@ async def asyncio(
) -> ErrorResponse | ScheduledAction | None:
"""Lower the price of an item's listings

Schedules a price drop of the item's existing listings, now, like the price drop of the app: the
listings are updated, not republished. `value` is what is removed from each listing's current price,
never the new price. Without `accountIds`, every account the item is online on. Requires
`items:write` and an `Idempotency-Key`.
Schedules a price drop of the item's existing listings, now or at `scheduledAt` (at most 30 days
ahead), like the price drop of the app: the listings are updated, not republished. `value` is what
is removed from each listing's current price, never the new price. Without `accountIds`, every
account the item is online on. Requires `items:write` and an `Idempotency-Key`.

Args:
id (int):
Expand Down
44 changes: 24 additions & 20 deletions src/controlresell/generated/api/items/publish_item.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,11 +118,12 @@ def sync_detailed(
) -> Response[ErrorResponse | ScheduledAction]:
"""Publish an item on the seller's accounts

Schedules the publication of one item of the seller's stock on the given marketplace accounts, now.
The publication runs on the account's browser: read its result on `GET /items/{id}/listings`. To
cross-list an item ("list it on eBay"), call this route with that account: this API never relays a
marketplace's own API. Publishing one item on several accounts of the same marketplace risks a
strike from it: name only the accounts you mean. Requires `items:write` and an `Idempotency-Key`.
Schedules the publication of one item of the seller's stock on the given marketplace accounts, now
or at `scheduledAt` (at most 30 days ahead). The publication runs on the account's browser: read its
result on `GET /items/{id}/listings`. To cross-list an item ("list it on eBay"), call this route
with that account: this API never relays a marketplace's own API. Publishing one item on several
accounts of the same marketplace risks a strike from it: name only the accounts you mean. Requires
`items:write` and an `Idempotency-Key`.

Args:
id (int):
Expand Down Expand Up @@ -159,11 +160,12 @@ def sync(
) -> ErrorResponse | ScheduledAction | None:
"""Publish an item on the seller's accounts

Schedules the publication of one item of the seller's stock on the given marketplace accounts, now.
The publication runs on the account's browser: read its result on `GET /items/{id}/listings`. To
cross-list an item ("list it on eBay"), call this route with that account: this API never relays a
marketplace's own API. Publishing one item on several accounts of the same marketplace risks a
strike from it: name only the accounts you mean. Requires `items:write` and an `Idempotency-Key`.
Schedules the publication of one item of the seller's stock on the given marketplace accounts, now
or at `scheduledAt` (at most 30 days ahead). The publication runs on the account's browser: read its
result on `GET /items/{id}/listings`. To cross-list an item ("list it on eBay"), call this route
with that account: this API never relays a marketplace's own API. Publishing one item on several
accounts of the same marketplace risks a strike from it: name only the accounts you mean. Requires
`items:write` and an `Idempotency-Key`.

Args:
id (int):
Expand Down Expand Up @@ -195,11 +197,12 @@ async def asyncio_detailed(
) -> Response[ErrorResponse | ScheduledAction]:
"""Publish an item on the seller's accounts

Schedules the publication of one item of the seller's stock on the given marketplace accounts, now.
The publication runs on the account's browser: read its result on `GET /items/{id}/listings`. To
cross-list an item ("list it on eBay"), call this route with that account: this API never relays a
marketplace's own API. Publishing one item on several accounts of the same marketplace risks a
strike from it: name only the accounts you mean. Requires `items:write` and an `Idempotency-Key`.
Schedules the publication of one item of the seller's stock on the given marketplace accounts, now
or at `scheduledAt` (at most 30 days ahead). The publication runs on the account's browser: read its
result on `GET /items/{id}/listings`. To cross-list an item ("list it on eBay"), call this route
with that account: this API never relays a marketplace's own API. Publishing one item on several
accounts of the same marketplace risks a strike from it: name only the accounts you mean. Requires
`items:write` and an `Idempotency-Key`.

Args:
id (int):
Expand Down Expand Up @@ -234,11 +237,12 @@ async def asyncio(
) -> ErrorResponse | ScheduledAction | None:
"""Publish an item on the seller's accounts

Schedules the publication of one item of the seller's stock on the given marketplace accounts, now.
The publication runs on the account's browser: read its result on `GET /items/{id}/listings`. To
cross-list an item ("list it on eBay"), call this route with that account: this API never relays a
marketplace's own API. Publishing one item on several accounts of the same marketplace risks a
strike from it: name only the accounts you mean. Requires `items:write` and an `Idempotency-Key`.
Schedules the publication of one item of the seller's stock on the given marketplace accounts, now
or at `scheduledAt` (at most 30 days ahead). The publication runs on the account's browser: read its
result on `GET /items/{id}/listings`. To cross-list an item ("list it on eBay"), call this route
with that account: this API never relays a marketplace's own API. Publishing one item on several
accounts of the same marketplace risks a strike from it: name only the accounts you mean. Requires
`items:write` and an `Idempotency-Key`.

Args:
id (int):
Expand Down
48 changes: 24 additions & 24 deletions src/controlresell/generated/api/items/republish_item.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,12 +119,12 @@ def sync_detailed(
) -> Response[ErrorResponse | ScheduledAction]:
"""Republish an item on the seller's accounts

Schedules the republication of one item of the seller's stock, now, exactly as the app and the MCP
tool `republish_items` do: ControlResell deletes the listing and publishes it again from the item it
holds, with the same safeguards (republication pace, publication guards). eBay, Shopify and Etsy do
not republish: their accounts are refused (`republish_not_supported`). Without `accountIds`, every
account the item is listed on. The republication runs on the account's browser: read its result on
`GET /items/{id}/listings`.
Schedules the republication of one item of the seller's stock, now or at `scheduledAt` (at most 30
days ahead), exactly as the app and the MCP tool `republish_items` do: ControlResell deletes the
listing and publishes it again from the item it holds, with the same safeguards (republication pace,
publication guards). eBay, Shopify and Etsy do not republish: their accounts are refused
(`republish_not_supported`). Without `accountIds`, every account the item is listed on. The
republication runs on the account's browser: read its result on `GET /items/{id}/listings`.

This API never relays a marketplace's own API (Vinted, eBay…): every write runs a ControlResell use
case on an item of the seller's stock. To cross-list an item on another account or marketplace
Expand Down Expand Up @@ -166,12 +166,12 @@ def sync(
) -> ErrorResponse | ScheduledAction | None:
"""Republish an item on the seller's accounts

Schedules the republication of one item of the seller's stock, now, exactly as the app and the MCP
tool `republish_items` do: ControlResell deletes the listing and publishes it again from the item it
holds, with the same safeguards (republication pace, publication guards). eBay, Shopify and Etsy do
not republish: their accounts are refused (`republish_not_supported`). Without `accountIds`, every
account the item is listed on. The republication runs on the account's browser: read its result on
`GET /items/{id}/listings`.
Schedules the republication of one item of the seller's stock, now or at `scheduledAt` (at most 30
days ahead), exactly as the app and the MCP tool `republish_items` do: ControlResell deletes the
listing and publishes it again from the item it holds, with the same safeguards (republication pace,
publication guards). eBay, Shopify and Etsy do not republish: their accounts are refused
(`republish_not_supported`). Without `accountIds`, every account the item is listed on. The
republication runs on the account's browser: read its result on `GET /items/{id}/listings`.

This API never relays a marketplace's own API (Vinted, eBay…): every write runs a ControlResell use
case on an item of the seller's stock. To cross-list an item on another account or marketplace
Expand Down Expand Up @@ -208,12 +208,12 @@ async def asyncio_detailed(
) -> Response[ErrorResponse | ScheduledAction]:
"""Republish an item on the seller's accounts

Schedules the republication of one item of the seller's stock, now, exactly as the app and the MCP
tool `republish_items` do: ControlResell deletes the listing and publishes it again from the item it
holds, with the same safeguards (republication pace, publication guards). eBay, Shopify and Etsy do
not republish: their accounts are refused (`republish_not_supported`). Without `accountIds`, every
account the item is listed on. The republication runs on the account's browser: read its result on
`GET /items/{id}/listings`.
Schedules the republication of one item of the seller's stock, now or at `scheduledAt` (at most 30
days ahead), exactly as the app and the MCP tool `republish_items` do: ControlResell deletes the
listing and publishes it again from the item it holds, with the same safeguards (republication pace,
publication guards). eBay, Shopify and Etsy do not republish: their accounts are refused
(`republish_not_supported`). Without `accountIds`, every account the item is listed on. The
republication runs on the account's browser: read its result on `GET /items/{id}/listings`.

This API never relays a marketplace's own API (Vinted, eBay…): every write runs a ControlResell use
case on an item of the seller's stock. To cross-list an item on another account or marketplace
Expand Down Expand Up @@ -253,12 +253,12 @@ async def asyncio(
) -> ErrorResponse | ScheduledAction | None:
"""Republish an item on the seller's accounts

Schedules the republication of one item of the seller's stock, now, exactly as the app and the MCP
tool `republish_items` do: ControlResell deletes the listing and publishes it again from the item it
holds, with the same safeguards (republication pace, publication guards). eBay, Shopify and Etsy do
not republish: their accounts are refused (`republish_not_supported`). Without `accountIds`, every
account the item is listed on. The republication runs on the account's browser: read its result on
`GET /items/{id}/listings`.
Schedules the republication of one item of the seller's stock, now or at `scheduledAt` (at most 30
days ahead), exactly as the app and the MCP tool `republish_items` do: ControlResell deletes the
listing and publishes it again from the item it holds, with the same safeguards (republication pace,
publication guards). eBay, Shopify and Etsy do not republish: their accounts are refused
(`republish_not_supported`). Without `accountIds`, every account the item is listed on. The
republication runs on the account's browser: read its result on `GET /items/{id}/listings`.

This API never relays a marketplace's own API (Vinted, eBay…): every write runs a ControlResell use
case on an item of the seller's stock. To cross-list an item on another account or marketplace
Expand Down
Loading
Loading