Sincronização por CSV: especificação completa
Especificação do CSV de artigos: campos, limites, atributos de carro e mota, e envio por SFTP ou por URL.
Para a sincronização entre os clientes e o Portal Hero utilizamos um sistema de ficheiros CSV. O principal ficheiro CSV é o de artigos (ou feed de artigos), onde se listam todos os artigos que se publicam nos diferentes portais. Neste ficheiro encontram-se os artigos com as suas características.
Funcionamento da sincronização
A forma de identificar cada artigo será através do campo id, no qual nos basearemos como identificador único para decidir se um artigo é atualizado ou deixa de existir. Quando um artigo aparecer pela primeira vez no feed de artigos, este será enviado para todos os portais selecionados pelo cliente. Quando um artigo deixar de estar presente no feed, será marcado como vendido, e quando se alterar qualquer dado do artigo também será atualizado nos portais. Para teres mais detalhes sobre a sincronização em si, podes consultá-los aqui.
O formato geral destes ficheiros CSV é o seguinte:
- Campos separados por vírgulas
- O cabeçalho tem de estar presente para poder identificar os campos
- Campos delimitados por aspas duplas (se necessário ou sempre)
- Codificação do ficheiro UTF-8
Partilha de ficheiros
Temos duas opções para nos fazeres chegar o ficheiro:
- SFTP
Dispomos de um SFTP para partilhar os ficheiros e facilitar a troca de informação de forma segura. Os dados de acesso ao SFTP (utilizador e palavra-passe) serão fornecidos durante o processo de onboarding.
Os restantes dados comuns de ligação são os seguintes:- Host:
sftp.portalhero.pro - Port:
2222
Além disso, o SFTP está protegido e restringido ao nível de rede e precisaremos de um ou vários IPs para os adicionar à nossa lista de IPs de acesso permitidos.
Dentro do SFTP há criada uma pasta chamada upload onde se escreverão os ficheiros: para o de artigos o nome do ficheiro será: item_feed.csv - Host:
- url
O feed de artigos também pode ser enviado através de um URL público, de onde o processo do Portal Hero o descarregará em cada execução diária do processo.
O URL deverá ser informado pelo cliente durante o processo de onboarding. Caso sejam necessárias mais medidas de segurança, podes fornecer-nos qualquer header(s) que adicionaremos ao pedido.
Formato dos ficheiros CSV
Relação dos campos, tipologia de detalhes e exemplos do ficheiro CSV de artigos:
| Nome | Tipo | Obrigatório | Descrição | Exemplo |
|---|---|---|---|---|
| id | string | Sim | Identificador único do artigo. Tem de ser único para todos os artigos e é o que usaremos para referir os artigos nas nossas comunicações. (Comprimento máximo: 150 caracteres) | wer432r |
| price | double | Sim | Preço em € com uma precisão de 2 casas decimais (não obrigatórias) do artigo. | 344.95 |
| external_category | string | Sim | Identificador da categoria onde enviar o artigo. Deve ser um texto com a categoria, não um identificador numérico. Pode ser diretamente a categoria que exista no teu sistema. | Camisetas manga corta |
| status | string | Sim | Condição do artigo. Os valores estão limitados a uma enumeração que também se fornece mais adiante. | good |
| title | string | Sim | Título do artigo. Máximo 60 caracteres. | Camiseta verde |
| description | string | Sim | Descrição do artigo. Máximo 600 caracteres. | Camiseta verde talla M… |
| images | list string | Sim | Campo composto criado com a concatenação através de "|" (pipe) dos diferentes urls das imagens do artigo. Estas têm de ser publicamente acessíveis e em formato jpg. Máximo 10 imagens. | https://image-cdn.com/image1.jpg|https://image-cdn.com/image2.jpg|https://image-cdn.com/image3.jpg |
| store | list string | Não | Identificador da conta no portal onde publicar este artigo. Só é necessário caso tenhas mais do que uma conta onde publicar artigos. No caso de teres mais do que uma conta ou mais do que um portal associado ao produto, tem de ser uma lista de inteiros separados por "|" (pipe). | 2|F5 |
| portal_status | string | Não | Estado de publicação do artigo. Estados possíveis: “active”, “reserved” | active |
| shipping | bool | Não | Booleano para indicar se se aceitam envios dentro do portal para o artigo. | true |
| shipping_weight_kg | int | Não | Campo associado ao campo "shipping", é necessário se o campo shipping for true. Indica o peso em kg (arredondado para cima sem casas decimais) do artigo. | 3 |
| free_shipping | bool | Não | Booleano para indicar se é o vendedor quem assume os custos do envio e, por conseguinte, são gratuitos para o comprador. | true |
| hashtags | string | Não | Campo composto criado com a concatenação através de "|" (pipe) das diferentes hashtags. Cada uma delas é uma só palavra sem espaços e sem o cardinal (#) precedente. | bluetooth|bajoconsumo|geek |
| brand | String | Não | Marca do artigo | Apple |
| model | String | Não | Modelo do artigo | iPhone 15 pro |
| stock | int | Não | Número de artigos | 3 |
| attributes | str | Não | Campo para atributos adicionais do artigo. Dependendo da categoria, alguns destes atributos podem ser obrigatórios. * | additional attributes |
* Para os artigos de carros, devem fornecer-se os seguintes atributos no campo 'attributes' como uma string JSON serializada:
Quanto ao campo status, que faz referência ao estado dos artigos, as opções são as seguintes:
["new", "as_good_as_new", "good", "fair", "has_given_it_all"]
Atributos do Carro
Os atributos do carro são um conjunto de características que descrevem um carro. Utilizam-se no feed e para o publicar nos marketplaces.
| Nome | Tipo | Obrigatório | Descrição | Exemplo |
|---|---|---|---|---|
| version | String | Sim | Versão do motor ou nível de acabamento do carro. | 1.6 TDI |
| year | Int | Sim | Ano de fabrico. | 2018 |
| km | Int | Sim | Quilometragem em quilómetros. | 60000 |
| horse_power | Int | Sim | Potência do motor em CV (DIN). | 105 |
| doors | Int | Não | Número de portas. | 5 |
| body_type | String | Não | Tipo de carroçaria ou estilo. Valores possíveis:'small_car', 'coupe_cabrio', 'sedan', 'family_car', 'mini_van', 'four_x_four', 'van', 'others' | sedan |
| engine | String | Sim | Tipo de combustível. Valores possíveis:'gasoil', 'gasolina', 'electric_hybrid', 'others' | gasoil |
| gear_box | String | Sim | Tipo de caixa de velocidades. Valores possíveis são:'manual', 'automatic' | manual |
Exemplo (python):
car_attrs = {
"version": "1.6 TDI Toyota",
"year": "2018",
"horse_power": 100,
"mileage": 12000,
"engine": "gasoil",
"gearbox": "manual"
}
attributes = json.dumps(car_attrs)
Atributos da mota
Para integrar motas, o artigo deve incluir a informação específica do veículo. Os dados técnicos são enviados serializados como JSON no campo 'attributes', enquanto a marca e o modelo viajam nos campos 'brand' e 'model' do CSV.
O campo 'external_category' deve tomar um dos valores '2', 'Motos', 'Motorbikes' para que o artigo seja processado como mota. Esta integração requer ter ativo o serviço de ERP de motas na tua conta.
Os valores de 'brand' e 'model' têm de coincidir exatamente com os da nossa taxonomia de motas. Para consultar os valores válidos dispomos de dois endpoints públicos (requerem autenticação e o serviço ERP de motas ativo):
GET /motorbike_brands— devolve a lista completa de marcas disponíveis, com o seu 'uid' e 'value'.GET /motorbike_models?brand_id={uid}— devolve os modelos associados à marca indicada através de 'brand_id'.
Tem em conta que o título do artigo é gerado automaticamente a partir da marca, do modelo, da versão (se informada) e do ano, pelo que o valor do campo 'title' será sobrescrito nas motas.
| Nome | Tipo | Obrigatório | Descrição | Exemplo |
|---|---|---|---|---|
| year | Int | Sim | Ano de matrícula. Valor entre 1950 e o ano seguinte ao atual. | 2020 |
| version | String | Não | Nome comercial ou versão do modelo. Adiciona-se ao título gerado automaticamente. | modelo actual |
| km | Int | Sim | Quilometragem em quilómetros. Não pode ser negativa. | 5420 |
| horse_power | Int | Não | Potência do motor em CV. Tem de ser um valor positivo. | 47 |
| engine_capacity_cc | Int | Não | Cilindrada do motor em centímetros cúbicos. Tem de ser um valor positivo. | 400 |
| fuel_type | String | Não | Tipo de combustível. Valores possíveis: 'gasoline', 'electric'. Se não for informado, por defeito é 'gasoline'. | gasoline |
| license_plate | String | Não | Matrícula do veículo. | 1234 ABC |
Exemplo (python):
motorbike_attrs = {
"year": 2020,
"version": "modelo actual",
"km": 5420,
"horse_power": 47,
"engine_capacity_cc": 400,
"fuel_type": "gasoline",
"license_plate": "1234 ABC"
}
attributes = json.dumps(motorbike_attrs)