Reseller profile, addresses & documents
The reseller's store profile with status, customer type, assigned delegate and support region, the fields a reseller may edit, store documents (RC, NIF, NIS, ID) and delivery addresses.
The « Mon magasin » and « Adresses de livraison » screens of the reseller app (Imad, MRA-07, MRA-04) and the profile pages of the reseller web (Anis, WEB-05). The record is the CRM Reseller (cahier §4.2, §15.5 — CRM-01); built in SRV-14.
- Own record only, signed-in resellers —
PENDING_VALIDATIONaccounts included (they complete their store and documents while waiting). - Two kinds of fields. Contact and location details are edited by the reseller; identity fields — main phone always, store name, wilaya, commune and legal identifiers once the account is approved — change only through support and the back-office (
403 FIELD_NOT_EDITABLE). The customer type is set by the back-office only (403 FIELD_NOT_EDITABLE, AUTH-11). - Every change is audited with before/after values (AUD-02) and appears on the CRM timeline of the reseller.
- The login itself (name, language, avatar, phone change by OTP) is
me.update.
| Method | Path | Operation | Access | Apps | Release |
|---|---|---|---|---|---|
| GET | /reseller/profile | profile.getMy store profile, status, assigned delegate and contact | self | RA · RW | V1 |
| PATCH | /reseller/profile | profile.updateUpdate the fields a reseller may edit (others go through support) | self | RA · RW | V1 |
| GET | /reseller/documents | profile.documents.listMy store documents | self | RA · RW | V1 |
| POST | /reseller/documents | profile.documents.addAttach an uploaded document (RC, NIF, ID…) | selfIdempotency-Key | RA · RW | V1 |
| GET | /reseller/addresses | addresses.listMy delivery addresses | self | RA · RW | V1 |
| POST | /reseller/addresses | addresses.createAdd a delivery address | selfIdempotency-Key | RA · RW | V1 |
| PATCH | /reseller/addresses/{addressId} | addresses.updateEdit a delivery address | self | RA · RW | V1 |
| DELETE | /reseller/addresses/{addressId} | addresses.removeDelete a delivery address (not the last one) | self | RA · RW | V1 |
| POST | /reseller/addresses/{addressId}/default | addresses.setDefaultMake an address the default | self | RA · RW | V1 |
Every operation can also answer 401 UNAUTHENTICATED, 403 ACCOUNT_SUSPENDED, 403 PERMISSION_DENIED (caller is not a reseller), 426 UPGRADE_REQUIRED, 429 RATE_LIMITED, 500 INTERNAL_ERROR and 503 MAINTENANCE; operations with Idempotency-Key required also 400 IDEMPOTENCY_KEY_REQUIRED, 409 IDEMPOTENCY_KEY_REUSED, 409 IDEMPOTENCY_IN_PROGRESS. See the error registry.
Editable fields
| Field | ValidationStatus PENDING or REJECTED | APPROVED |
|---|---|---|
ownerName, whatsapp, email, addressLine, landmark, location, businessTypeCode | reseller | reseller |
storeName, wilayaCode, communeId, legalIds | reseller | support only — 403 FIELD_NOT_EDITABLE |
phone (main phone, sign-in identifier) | support only | support only |
customerType | back-office only — 403 FIELD_NOT_EDITABLE | back-office only |
number, status, potential, validationStatus, assignedDelegate, supportRegion | read-only (not accepted in the body) | read-only |
The response carries editableFields and supportOnlyFields for the current state, so the form disables the right inputs and offers « Demander une modification » (a support ticket) for the others.
Assumption — wilayaCode and communeId are frozen after approval (the brief names phone and store name) because they drive the delegate assignment, the zone, promotion targeting and the support region.
Schemas
interface ResellerProfile {
id: Uuid;
number: string; // REV-000123
storeName: string;
ownerName: string;
phone: string; // E.164, main phone
whatsapp: string | null;
email: string | null;
customerType: CustomerType; // SUPER_GROS | DEMI_GROS | DETAIL — selects the price
wilayaCode: string;
wilayaName: string;
communeId: Uuid;
communeName: string;
addressLine: string;
landmark: string | null;
location: GeoPoint | null;
businessType: { code: string; label: string }; // BUSINESS_TYPE reference item
potential: "LOW" | "MEDIUM" | "HIGH"; // internal assessment — not displayed by the apps
status: ResellerStatus; // commercial lifecycle (SUSPENDED blocks ordering)
accountStatus: AccountStatus;
validationStatus: ValidationStatus;
validatedAt: Iso | null;
rejectionReason: string | null; // shown on RA-06 when REJECTED
legalIds: { rc: string | null; nif: string | null; nis: string | null; ai: string | null };
assignedDelegate: { id: Uuid; displayName: string; phone: string } | null;
supportRegion: { id: Uuid; name: string; whatsappNumber: string } | null;
documents: { count: number; requiredTypes: DocumentType[]; missingTypes: DocumentType[] };
editableFields: string[];
supportOnlyFields: string[];
createdAt: Iso;
updatedAt: Iso;
}
interface ResellerDocument {
id: Uuid;
type: DocumentType; // COMMERCE_REGISTER, TAX_ID, STAT_ID, ARTICLE_ID, ID_CARD, CONTRACT, OTHER
number: string | null; // number printed on the document
file: FileRef; // STORE_DOCUMENT, signed URL (5 min)
status: ValidationStatus; // checked by the back-office
rejectionReason: string | null;
uploadedAt: Iso;
uploadedBy: "RESELLER" | "DELEGATE" | "STAFF";
expiresOn: string | null; // YYYY-MM-DD (ID card)
}Addresses use the shared Address schema.
Operations
GET /reseller/profile
profile.get · Access session — reseller (self) · Apps RA, RW · Idempotency-Key — · Release V1 · Requirements CRM-01
Purpose. « Mon magasin »: the store record with its statuses, customer type, legal identifiers, assigned delegate, support region and documents summary.
Request — no parameters.
Response — 200 OK, Cache-Control: private, no-store: a ResellerProfile.
{
"id": "01a17f02-93c4-7e8a-b1d2-4f5a6b7c8d90",
"number": "REV-000123",
"storeName": "Magasin El Wafa",
"ownerName": "Mohamed Benali",
"phone": "+213555123456",
"whatsapp": "+213555123456",
"email": "elwafa.oran@gmail.com",
"customerType": "DEMI_GROS",
"wilayaCode": "31",
"wilayaName": "Oran",
"communeId": "01a0c3e1-5d20-7a10-8b31-310300000003",
"communeName": "Bir El Djir",
"addressLine": "Cité USTO, local n° 14",
"landmark": "En face de la pharmacie Benyahia",
"location": { "lat": 35.7079, "lng": -0.5821, "accuracy": 18, "capturedAt": "2026-10-12T09:10:52Z" },
"businessType": { "code": "PHONE_SHOP", "label": "Boutique de téléphonie" },
"potential": "HIGH",
"status": "ACTIVE",
"accountStatus": "ACTIVE",
"validationStatus": "APPROVED",
"validatedAt": "2026-10-13T10:02:00Z",
"rejectionReason": null,
"legalIds": { "rc": "31/00-0874512 A 19", "nif": "001931087451236", "nis": null, "ai": null },
"assignedDelegate": { "id": "01a0f2b1-7d3c-7a45-9e61-0b2c3d4e5f60", "displayName": "Yacine Belkacem", "phone": "+213770123456" },
"supportRegion": { "id": "01a0c7e2-41d0-7a6b-9c3e-5f1a2b3c4d5e", "name": "Ouest", "whatsappNumber": "+213770900310" },
"documents": { "count": 2, "requiredTypes": ["COMMERCE_REGISTER", "TAX_ID"], "missingTypes": [] },
"editableFields": ["ownerName", "whatsapp", "email", "addressLine", "landmark", "location", "businessTypeCode"],
"supportOnlyFields": ["phone", "storeName", "wilayaCode", "communeId", "legalIds"],
"createdAt": "2026-10-12T09:14:00Z",
"updatedAt": "2026-10-28T16:40:00Z"
}| Field | Notes |
|---|---|
customerType | Shown as « Tarif : Demi-gros »; changing it is a request to HOCO (support), never a field (AUTH-11). |
status | SUSPENDED makes the apps show a banner and disable the checkout (lifecycle). |
assignedDelegate | « Mon délégué » with call and WhatsApp buttons; null when unassigned. |
documents.requiredTypes | From the setting crm.requiredDocumentTypes (assumption: RC and NIF by default); missingTypes drives the « Documents à fournir » reminder. Missing documents do not block ordering in V1. |
potential | Returned for completeness of the CRM record; the reseller apps do not display it. |
Errors — none specific.
Rules & side effects — read-only; the same record the delegate sees on the point-of-sale sheet (delegate.resellers.get), without internal notes, tasks or visit history.
Used by — RA-28 (« Mon magasin »), account hub RA-27, RW-12, pending/rejected screen RA-06.
PATCH /reseller/profile
profile.update · Access session — reseller (self) · Apps RA, RW · Idempotency-Key optional · Release V1 · Requirements CRM-01, AUD-02
Purpose. Updates the store fields the reseller may edit; omitted fields are unchanged, null clears an optional field.
Request
interface ProfileUpdateRequest {
ownerName?: string; // 2–80
whatsapp?: string | null; // E.164 after normalisation
email?: string | null;
addressLine?: string; // 5–200
landmark?: string | null; // ≤ 120
location?: GeoPoint | null; // pin moved on the map or phone GPS
businessTypeCode?: string; // BUSINESS_TYPE item
storeName?: string; // before approval only
wilayaCode?: string; // before approval only, with communeId
communeId?: Uuid; // before approval only, must belong to the wilaya
legalIds?: { rc?: string | null; nif?: string | null; nis?: string | null; ai?: string | null }; // before approval only
phone?: string; // accepted in the schema to answer FIELD_NOT_EDITABLE clearly
customerType?: CustomerType; // idem — always refused, set by the back-office
}{
"whatsapp": "+213661778899",
"landmark": "En face de la pharmacie Benyahia, à côté de la boulangerie",
"location": { "lat": 35.70802, "lng": -0.58197, "accuracy": 6, "capturedAt": "2026-11-03T11:05:00Z" }
}Response — 200 OK: the updated ResellerProfile (only the changed fields differ from the profile.get example).
{
"id": "01a17f02-93c4-7e8a-b1d2-4f5a6b7c8d90",
"number": "REV-000123",
"storeName": "Magasin El Wafa",
"ownerName": "Mohamed Benali",
"phone": "+213555123456",
"whatsapp": "+213661778899",
"email": "elwafa.oran@gmail.com",
"customerType": "DEMI_GROS",
"wilayaCode": "31",
"wilayaName": "Oran",
"communeId": "01a0c3e1-5d20-7a10-8b31-310300000003",
"communeName": "Bir El Djir",
"addressLine": "Cité USTO, local n° 14",
"landmark": "En face de la pharmacie Benyahia, à côté de la boulangerie",
"location": { "lat": 35.70802, "lng": -0.58197, "accuracy": 6, "capturedAt": "2026-11-03T11:05:00Z" },
"businessType": { "code": "PHONE_SHOP", "label": "Boutique de téléphonie" },
"potential": "HIGH",
"status": "ACTIVE",
"accountStatus": "ACTIVE",
"validationStatus": "APPROVED",
"validatedAt": "2026-10-13T10:02:00Z",
"rejectionReason": null,
"legalIds": { "rc": "31/00-0874512 A 19", "nif": "001931087451236", "nis": null, "ai": null },
"assignedDelegate": { "id": "01a0f2b1-7d3c-7a45-9e61-0b2c3d4e5f60", "displayName": "Yacine Belkacem", "phone": "+213770123456" },
"supportRegion": { "id": "01a0c7e2-41d0-7a6b-9c3e-5f1a2b3c4d5e", "name": "Ouest", "whatsappNumber": "+213770900310" },
"documents": { "count": 2, "requiredTypes": ["COMMERCE_REGISTER", "TAX_ID"], "missingTypes": [] },
"editableFields": ["ownerName", "whatsapp", "email", "addressLine", "landmark", "location", "businessTypeCode"],
"supportOnlyFields": ["phone", "storeName", "wilayaCode", "communeId", "legalIds"],
"createdAt": "2026-10-12T09:14:00Z",
"updatedAt": "2026-11-03T11:05:30Z"
}Errors
| Status | Code | When |
|---|---|---|
| 400 | VALIDATION_FAILED | Unknown field; field codes INVALID_PHONE, INVALID_EMAIL, COMMUNE_NOT_IN_WILAYA, UNKNOWN_REFERENCE_CODE, INVALID_LOCATION (outside Algeria or accuracy above 100 m). |
| 403 | FIELD_NOT_EDITABLE | phone sent, or storeName, wilayaCode, communeId, legalIds sent after approval (details: { fields: ["storeName"], via: "SUPPORT" } — the app opens a pre-filled support ticket); or customerType sent (details: { fields: ["customerType"], via: "BACK_OFFICE" }). |
Rules & side effects
- The whole request is refused if any field is not editable (no partial update).
- One
AuditLogentryUPDATEwith before/after values andClientApp; anInteractionof typeNOTE« Fiche mise à jour par le revendeur » on the CRM timeline (BO-11). - If
validationStatusisREJECTED, changing a store detail puts the account back toPENDINGin the validation queue (lifecycle). - A changed
locationupdates the point used by the delegate's map and check-in tolerance; the assigned delegate gets the new position at the nextsync.delta. Delivery addresses are separate and unchanged. - A changed wilaya (before approval) recomputes the support region and proposes a new delegate assignment to the back-office.
Used by — « Modifier » on RA-28, RW-12; correction after a rejection on RA-06.
GET /reseller/documents
profile.documents.list · Access session — reseller (self) · Apps RA, RW · Idempotency-Key — · Release V1 · Requirements CRM-10
Purpose. My store documents (registre de commerce, NIF, NIS, article d'imposition, ID card, contract) with their verification status.
Request — no parameters.
Response — 200 OK: { items: ResellerDocument[], requiredTypes, missingTypes } — current documents only, newest first.
{
"items": [
{
"id": "01a12f6a-5460-767f-be75-48e3ed3db1fa",
"type": "TAX_ID",
"number": "001931087451236",
"file": { "id": "01a12f69-df30-7617-bd44-c4fdc6b626d6", "url": "https://storage.hoco.dz/hoco-private/store_document/2026/10/01a12f69-df30-7617-bd44-c4fdc6b626d6.pdf?X-Amz-Expires=300&X-Amz-Signature=6b1e…", "mimeType": "application/pdf", "size": 241337, "purpose": "STORE_DOCUMENT" },
"status": "APPROVED",
"rejectionReason": null,
"uploadedAt": "2026-10-12T09:21:00Z",
"uploadedBy": "DELEGATE",
"expiresOn": null
},
{
"id": "01a12f69-6a00-7fd9-9f42-2faa167a21c6",
"type": "COMMERCE_REGISTER",
"number": "31/00-0874512 A 19",
"file": { "id": "01a12f68-7fa0-7bdf-bdbc-17173826a53f", "url": "https://storage.hoco.dz/hoco-private/store_document/2026/10/01a12f68-7fa0-7bdf-bdbc-17173826a53f.jpg?X-Amz-Expires=300&X-Amz-Signature=c03a…", "thumbnailUrl": "https://storage.hoco.dz/hoco-private/store_document/2026/10/01a12f68-7fa0-7bdf-bdbc-17173826a53f-thumb.webp?X-Amz-Expires=300&X-Amz-Signature=9d71…", "mimeType": "image/jpeg", "size": 1184420, "purpose": "STORE_DOCUMENT" },
"status": "APPROVED",
"rejectionReason": null,
"uploadedAt": "2026-10-12T09:20:00Z",
"uploadedBy": "DELEGATE",
"expiresOn": null
}
],
"requiredTypes": ["COMMERCE_REGISTER", "TAX_ID"],
"missingTypes": []
}Errors — none specific.
Rules & side effects — read-only; URLs signed for 5 minutes and each issued URL is logged (sensitive documents, SEC-04). Store photos (façade, interior) are CRM data managed by the delegate and the back-office, not listed here.
Used by — « Documents » section of RA-28, RW-12.
POST /reseller/documents
profile.documents.add · Access session — reseller (self) · Apps RA, RW · Idempotency-Key required · Release V1 · Requirements CRM-10
Purpose. Attaches a document the reseller uploaded (photo or PDF) to the store record.
Request — upload first with files.createUpload (purpose STORE_DOCUMENT, ≤ 10 MB, PDF/JPEG/PNG) and files.completeUpload.
interface AddDocumentRequest {
type: DocumentType;
fileId: Uuid;
number?: string; // ≤ 40 characters
expiresOn?: string; // YYYY-MM-DD, future date (ID card)
}{ "type": "STAT_ID", "fileId": "01a1a10f-0ac0-7414-ac7b-e661c4e1059a", "number": "196931010874512" }Response — 201 Created: the ResellerDocument, status PENDING.
{
"id": "01a1a110-df80-736a-937e-e82869cadf96",
"type": "STAT_ID",
"number": "196931010874512",
"file": { "id": "01a1a10f-0ac0-7414-ac7b-e661c4e1059a", "url": "https://storage.hoco.dz/hoco-private/store_document/2026/11/01a1a10f-0ac0-7414-ac7b-e661c4e1059a.pdf?X-Amz-Expires=300&X-Amz-Signature=f2c8…", "mimeType": "application/pdf", "size": 205611, "purpose": "STORE_DOCUMENT" },
"status": "PENDING",
"rejectionReason": null,
"uploadedAt": "2026-11-03T11:00:00Z",
"uploadedBy": "RESELLER",
"expiresOn": null
}Errors
| Status | Code | When |
|---|---|---|
| 400 | VALIDATION_FAILED | Field codes INVALID_ENUM (type), FILE_NOT_FOUND (unknown or not uploaded by me), FILE_ALREADY_ATTACHED, IN_PAST (expiresOn). |
| 422 | FILE_NOT_READY | Upload not completed. |
| 422 | FILE_PURPOSE_MISMATCH | The file was not uploaded with purpose STORE_DOCUMENT. |
| 403 | FIELD_NOT_EDITABLE | Replacing an APPROVED RC, NIF, NIS or AI after the account's approval (identity documents change through support). |
Rules & side effects
- One current document per type: a new
ID_CARD,CONTRACTorOTHERreplaces the previous one of that type, which is kept in history (back-office only).OTHERallows several. - The number of a fiscal document fills the matching
legalIdsentry while the account is not approved. - Outbox
reseller.document_added: in-app task for validators (BO-13 / BO-11 documents tab) to check it; the reseller is notified of the decision.
Used by — « Ajouter un document » on RA-28, RW-12, and the pending screen RA-06.
GET /reseller/addresses
addresses.list · Access session — reseller (self) · Apps RA, RW · Idempotency-Key — · Release V1 · Requirements ORD-03
Purpose. My delivery addresses, default first.
Request — no parameters.
Response — 200 OK: { items: Address[] } — not paginated (at most 10).
{
"items": [
{
"id": "01a12f63-efa8-7f36-87fc-e386a4e58a22",
"label": "Magasin",
"recipientName": "Mohamed Benali",
"phone": "+213555123456",
"wilayaCode": "31",
"wilayaName": "Oran",
"communeId": "01a0c3e1-5d20-7a10-8b31-310300000003",
"communeName": "Bir El Djir",
"addressLine": "Cité USTO, local n° 14",
"landmark": "En face de la pharmacie Benyahia",
"location": { "lat": 35.7079, "lng": -0.5821, "accuracy": 18, "capturedAt": "2026-10-12T09:10:52Z" },
"isDefault": true
},
{
"id": "01a159ef-08c0-7ea9-bb81-447b0125a0b9",
"label": "Dépôt",
"recipientName": "Samir Benali",
"phone": "+213770456789",
"wilayaCode": "31",
"wilayaName": "Oran",
"communeId": "01a0c3e1-5d20-7a10-8b31-310100000001",
"communeName": "Oran",
"addressLine": "12, rue Larbi Ben M'hidi",
"isDefault": false
}
]
}Errors — none specific.
Rules & side effects — read-only. The first address is created at sign-up from the store address (or at validation for a record created by a delegate).
Used by — RA-19 (« Adresses de livraison »), address card of RA-18, RW-07, RW-12.
POST /reseller/addresses
addresses.create · Access session — reseller (self) · Apps RA, RW · Idempotency-Key required · Release V1 · Requirements ORD-03, GEO-01
Purpose. Adds a delivery address (wilaya and commune from the official reference — reference.communes).
Request
interface AddressCreateRequest {
label?: string; // ≤ 30, "Magasin", "Dépôt"
recipientName: string; // 2–80
phone: string; // E.164 after normalisation
wilayaCode: string;
communeId: Uuid; // must belong to wilayaCode
addressLine: string; // 5–200
landmark?: string; // ≤ 120
location?: GeoPoint;
isDefault?: boolean; // default false (true for the first address)
}{
"label": "Point de vente Es Senia",
"recipientName": "Mohamed Benali",
"phone": "0555 12 34 56",
"wilayaCode": "31",
"communeId": "01a0c3e1-5d20-7a10-8b31-310500000005",
"addressLine": "Cité 600 Logements, bloc 4, local 2",
"landmark": "À côté de la mosquée El Feth",
"isDefault": false
}Response — 201 Created: the Address.
{
"id": "01a1a0ec-4080-7430-a226-85df466f02b6",
"label": "Point de vente Es Senia",
"recipientName": "Mohamed Benali",
"phone": "+213555123456",
"wilayaCode": "31",
"wilayaName": "Oran",
"communeId": "01a0c3e1-5d20-7a10-8b31-310500000005",
"communeName": "Es Senia",
"addressLine": "Cité 600 Logements, bloc 4, local 2",
"landmark": "À côté de la mosquée El Feth",
"isDefault": false
}Errors
| Status | Code | When |
|---|---|---|
| 400 | VALIDATION_FAILED | Field codes REQUIRED, INVALID_PHONE, UNKNOWN_WILAYA, COMMUNE_NOT_IN_WILAYA, TOO_LONG, INVALID_LOCATION. |
| 422 | ADDRESS_LIMIT_REACHED | Already 10 addresses (details.limit). |
Rules & side effects — ResellerAddress created; with isDefault: true the previous default is unset in the same transaction. A wilaya not served by HOCO is accepted (the address shows deliverable: false in cart.checkoutOptions). Audited.
Used by — address form of RA-19, RW-07, RW-12.
PATCH /reseller/addresses/{addressId}
addresses.update · Access session — reseller (self) · Apps RA, RW · Idempotency-Key optional · Release V1 · Requirements ORD-03
Purpose. Edits an address; omitted fields are unchanged.
Request — the fields of AddressCreateRequest, all optional, except isDefault (use addresses.setDefault). wilayaCode and communeId are sent together.
{ "recipientName": "Samir Benali", "phone": "+213770456700", "landmark": "Entrée par la ruelle, porte verte" }Response — 200 OK: the updated Address.
{
"id": "01a159ef-08c0-7ea9-bb81-447b0125a0b9",
"label": "Dépôt",
"recipientName": "Samir Benali",
"phone": "+213770456700",
"wilayaCode": "31",
"wilayaName": "Oran",
"communeId": "01a0c3e1-5d20-7a10-8b31-310100000001",
"communeName": "Oran",
"addressLine": "12, rue Larbi Ben M'hidi",
"landmark": "Entrée par la ruelle, porte verte",
"isDefault": false
}Errors
| Status | Code | When |
|---|---|---|
| 400 | VALIDATION_FAILED | As for creation; isDefault in the body (USE_SET_DEFAULT). |
| 404 | NOT_FOUND | Not my address (or deleted). |
Rules & side effects — orders keep the address snapshot they were placed with: editing never changes past or open orders. Audited.
DELETE /reseller/addresses/{addressId}
addresses.remove · Access session — reseller (self) · Apps RA, RW · Idempotency-Key optional · Release V1 · Requirements ORD-03
Purpose. Deletes a delivery address — never the last one.
Request — path addressId.
Response — 200 OK: the remaining addresses { items: Address[] }. Deleting the default promotes the most recently used remaining address (or the oldest) to default.
{
"items": [
{
"id": "01a12f63-efa8-7f36-87fc-e386a4e58a22",
"label": "Magasin",
"recipientName": "Mohamed Benali",
"phone": "+213555123456",
"wilayaCode": "31",
"wilayaName": "Oran",
"communeId": "01a0c3e1-5d20-7a10-8b31-310300000003",
"communeName": "Bir El Djir",
"addressLine": "Cité USTO, local n° 14",
"landmark": "En face de la pharmacie Benyahia",
"location": { "lat": 35.7079, "lng": -0.5821, "accuracy": 18, "capturedAt": "2026-10-12T09:10:52Z" },
"isDefault": true
}
]
}Errors
| Status | Code | When |
|---|---|---|
| 404 | NOT_FOUND | Not my address. |
| 409 | LAST_ADDRESS | It is my only address — add another one first. |
Rules & side effects — soft delete (deletedAt): order snapshots are unaffected. Audited.
POST /reseller/addresses/{addressId}/default
addresses.setDefault · Access session — reseller (self) · Apps RA, RW · Idempotency-Key optional · Release V1 · Requirements ORD-03
Purpose. Makes an address the default — pre-selected at checkout and used for the cart's delivery fee.
Request — path addressId; no body.
Response — 200 OK: all addresses { items: Address[] }, the new default first (same shape as addresses.list).
{
"items": [
{
"id": "01a159ef-08c0-7ea9-bb81-447b0125a0b9",
"label": "Dépôt",
"recipientName": "Samir Benali",
"phone": "+213770456700",
"wilayaCode": "31",
"wilayaName": "Oran",
"communeId": "01a0c3e1-5d20-7a10-8b31-310100000001",
"communeName": "Oran",
"addressLine": "12, rue Larbi Ben M'hidi",
"landmark": "Entrée par la ruelle, porte verte",
"isDefault": true
},
{
"id": "01a12f63-efa8-7f36-87fc-e386a4e58a22",
"label": "Magasin",
"recipientName": "Mohamed Benali",
"phone": "+213555123456",
"wilayaCode": "31",
"wilayaName": "Oran",
"communeId": "01a0c3e1-5d20-7a10-8b31-310300000003",
"communeName": "Bir El Djir",
"addressLine": "Cité USTO, local n° 14",
"landmark": "En face de la pharmacie Benyahia",
"location": { "lat": 35.7079, "lng": -0.5821, "accuracy": 18, "capturedAt": "2026-10-12T09:10:52Z" },
"isDefault": false
}
]
}Errors
| Status | Code | When |
|---|---|---|
| 404 | NOT_FOUND | Not my address. |
Rules & side effects — exactly one default per reseller (unique partial index); idempotent when the address is already the default.
Promotions, banners & packs
Banners per placement, promotions and daily offers with their eligible products, and V2 profitable packs — targeted server-side to the caller, open to guests without prices.
Support tickets
Reseller support: tickets and after-sales (SAV) claims with their conversation and resolution, support contacts and FAQ, and the regional WhatsApp number resolved from the account or the device location.