HOCO B2B
SRSAPI reference

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_VALIDATION accounts 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.
MethodPathOperationAccessAppsRelease
GET/reseller/profileprofile.get
My store profile, status, assigned delegate and contact
selfRA · RWV1
PATCH/reseller/profileprofile.update
Update the fields a reseller may edit (others go through support)
selfRA · RWV1
GET/reseller/documentsprofile.documents.list
My store documents
selfRA · RWV1
POST/reseller/documentsprofile.documents.add
Attach an uploaded document (RC, NIF, ID…)
self
Idempotency-Key
RA · RWV1
GET/reseller/addressesaddresses.list
My delivery addresses
selfRA · RWV1
POST/reseller/addressesaddresses.create
Add a delivery address
self
Idempotency-Key
RA · RWV1
PATCH/reseller/addresses/{addressId}addresses.update
Edit a delivery address
selfRA · RWV1
DELETE/reseller/addresses/{addressId}addresses.remove
Delete a delivery address (not the last one)
selfRA · RWV1
POST/reseller/addresses/{addressId}/defaultaddresses.setDefault
Make an address the default
selfRA · RWV1

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

FieldValidationStatus PENDING or REJECTEDAPPROVED
ownerName, whatsapp, email, addressLine, landmark, location, businessTypeCoderesellerreseller
storeName, wilayaCode, communeId, legalIdsresellersupport only — 403 FIELD_NOT_EDITABLE
phone (main phone, sign-in identifier)support onlysupport only
customerTypeback-office only — 403 FIELD_NOT_EDITABLEback-office only
number, status, potential, validationStatus, assignedDelegate, supportRegionread-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"
}
FieldNotes
customerTypeShown as « Tarif : Demi-gros »; changing it is a request to HOCO (support), never a field (AUTH-11).
statusSUSPENDED 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.requiredTypesFrom the setting crm.requiredDocumentTypes (assumption: RC and NIF by default); missingTypes drives the « Documents à fournir » reminder. Missing documents do not block ordering in V1.
potentialReturned 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

StatusCodeWhen
400VALIDATION_FAILEDUnknown field; field codes INVALID_PHONE, INVALID_EMAIL, COMMUNE_NOT_IN_WILAYA, UNKNOWN_REFERENCE_CODE, INVALID_LOCATION (outside Algeria or accuracy above 100 m).
403FIELD_NOT_EDITABLEphone 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

  1. The whole request is refused if any field is not editable (no partial update).
  2. One AuditLog entry UPDATE with before/after values and ClientApp; an Interaction of type NOTE « Fiche mise à jour par le revendeur » on the CRM timeline (BO-11).
  3. If validationStatus is REJECTED, changing a store detail puts the account back to PENDING in the validation queue (lifecycle).
  4. A changed location updates the point used by the delegate's map and check-in tolerance; the assigned delegate gets the new position at the next sync.delta. Delivery addresses are separate and unchanged.
  5. 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

StatusCodeWhen
400VALIDATION_FAILEDField codes INVALID_ENUM (type), FILE_NOT_FOUND (unknown or not uploaded by me), FILE_ALREADY_ATTACHED, IN_PAST (expiresOn).
422FILE_NOT_READYUpload not completed.
422FILE_PURPOSE_MISMATCHThe file was not uploaded with purpose STORE_DOCUMENT.
403FIELD_NOT_EDITABLEReplacing an APPROVED RC, NIF, NIS or AI after the account's approval (identity documents change through support).

Rules & side effects

  1. One current document per type: a new ID_CARD, CONTRACT or OTHER replaces the previous one of that type, which is kept in history (back-office only). OTHER allows several.
  2. The number of a fiscal document fills the matching legalIds entry while the account is not approved.
  3. 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

StatusCodeWhen
400VALIDATION_FAILEDField codes REQUIRED, INVALID_PHONE, UNKNOWN_WILAYA, COMMUNE_NOT_IN_WILAYA, TOO_LONG, INVALID_LOCATION.
422ADDRESS_LIMIT_REACHEDAlready 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

StatusCodeWhen
400VALIDATION_FAILEDAs for creation; isDefault in the body (USE_SET_DEFAULT).
404NOT_FOUNDNot my address (or deleted).

Rules & side effects — orders keep the address snapshot they were placed with: editing never changes past or open orders. Audited.

Used by — RA-19, RW-12.

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

StatusCodeWhen
404NOT_FOUNDNot my address.
409LAST_ADDRESSIt is my only address — add another one first.

Rules & side effects — soft delete (deletedAt): order snapshots are unaffected. Audited.

Used by — RA-19, RW-12.

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

StatusCodeWhen
404NOT_FOUNDNot my address.

Rules & side effects — exactly one default per reseller (unique partial index); idempotent when the address is already the default.

Used by — RA-19, RW-12.

On this page