{"openapi":"3.0.3","info":{"title":"Prensalink External API","version":"1.0.0","description":"API externa de Prensalink para consultar el catálogo, gestionar el carrito y preparar pedidos de clientes, autenticar usuarios y permitir que los proveedores gestionen sus medios."},"servers":[{"url":"https://shop.prensalink.com/api-external/v1","description":"Producción"}],"tags":[{"name":"Identidad","description":"Consulta de la identidad autenticada."},{"name":"Catálogo","description":"Consulta del catálogo de productos."},{"name":"Carrito","description":"Gestión del carrito."},{"name":"Configuración","description":"Consulta y configuración de las unidades de productos en el carrito."},{"name":"Preparación del pedido","description":"Perfiles de facturación, saldo, métodos de pago y presupuesto del pedido."},{"name":"Pedidos","description":"Confirmación con saldo o transferencia y consulta de pedidos propios."},{"name":"Facturas","description":"Consulta y descarga de facturas ya emitidas para el cliente."},{"name":"Valores Auxiliares","description":"Valores auxiliares para construir peticiones."},{"name":"Gestión de Medios","description":"Consulta y gestión de los medios de un proveedor."},{"name":"Gestión de Medios en Bulk","description":"Validación y procesamiento de hasta 100 medios por petición."},{"name":"Documentación","description":"Contrato OpenAPI de esta versión."}],"x-guides":[{"id":"authentication","title":"Autenticación","description":"Las API keys de usuario se envían como Bearer token."},{"id":"scopes","title":"Permisos y scopes","description":"Cada credencial limita las operaciones disponibles. Los endpoints indican los scopes requeridos. Una API key válida sin el scope necesario devuelve HTTP 403."},{"id":"provider-media","title":"API para proveedores","description":"Un proveedor puede consultar, dar de alta y modificar sus medios utilizando su propia API key."},{"id":"idempotency","title":"Idempotencia","description":"En las altas y modificaciones de medios, utiliza una Idempotency-Key única por operación lógica. Al reintentar durante 24 horas con la misma clave y el mismo JSON se devuelve la respuesta original."},{"id":"rate-limits","title":"Límites de peticiones","description":"La API aplica límites por IP, por credencial y por intentos de autenticación fallidos. La creación de pedidos tiene además límites por cuenta de cliente, compartidos por todas sus API keys. Cuando se supera un límite temporal responde HTTP 429 e incluye Retry-After."},{"id":"availability","title":"Mantenimiento y disponibilidad","description":"Durante tareas de mantenimiento, la API puede pausar temporalmente todas las operaciones o solamente las de escritura. Cada petición afectada responde HTTP 503 e incluye Retry-After. Las integraciones deben tratar esta respuesta como temporal y reintentar más adelante.","response_status":503,"error_codes":["api_temporarily_unavailable","api_read_only"],"retry_header":"Retry-After"}],"x-rate-limit-policies":{"image_upload_customer":{"limit":10,"metric":"requests","window_seconds":60,"scope":"customer_account"},"image_upload_global":{"limit":30,"metric":"requests","window_seconds":60,"scope":"image_upload_global"},"ip":{"limit":300,"metric":"requests","window_seconds":60,"scope":"ip"},"credential":{"limit":60,"metric":"requests","window_seconds":60,"scope":"credential"},"failed_authentication":{"limit":20,"metric":"failed_authentications","window_seconds":60,"scope":"ip"},"customer_order_attempts":{"limit":5,"metric":"order_attempts","window_seconds":60,"scope":"customer_account"},"customer_orders_created":{"limit":10,"metric":"created_orders","window_seconds":3600,"scope":"customer_account"},"customer_pending_bank_transfers":{"limit":10,"metric":"pending_bank_transfers","scope":"customer_account_bank_transfer"},"bulk_validate_requests":{"limit":15,"metric":"requests","window_seconds":60,"scope":"bulk_credential"},"bulk_validate_items":{"limit":500,"metric":"items","window_seconds":60,"scope":"bulk_credential"},"bulk_execute_requests":{"limit":10,"metric":"requests","window_seconds":60,"scope":"bulk_credential"},"bulk_execute_items":{"limit":200,"metric":"items","window_seconds":60,"scope":"bulk_credential"},"bulk_global_requests":{"limit":120,"metric":"requests","window_seconds":60,"scope":"bulk_global"},"bulk_global_items":{"limit":1000,"metric":"items","window_seconds":60,"scope":"bulk_global"}},"paths":{"/openapi.json":{"get":{"tags":["Documentación"],"summary":"Descargar la especificación OpenAPI","operationId":"getOpenApiSpecification","security":[],"x-public-rate-limits":["ip"],"responses":{"200":{"description":"Especificación OpenAPI v1 en formato JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/me":{"get":{"tags":["Identidad"],"summary":"Consultar la identidad autenticada","description":"Comprueba la API key de usuario y devuelve la cuenta actual y los permisos efectivos de la credencial utilizada.","operationId":"getAuthenticatedUser","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["products:read"],"x-codeSamples":[{"lang":"curl","source":"curl --request GET \\\n  --url 'https://shop.prensalink.com/api-external/v1/me' \\\n  --header 'Authorization: Bearer plk_live_xxxxxxxxx'"}],"responses":{"200":{"description":"Identidad autenticada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentityResponse"},"example":{"data":{"user":{"name":"Ernesto","email":"editor@example.com","country":"ES","roles":["customer","provider"],"is_admin":false},"credential":{"name":"Integración con mi plataforma","scopes":["products:read","provider.media:read"],"expires_at":"2027-09-07T11:27:45+00:00"}}}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/products":{"get":{"tags":["Catálogo"],"summary":"Listar productos disponibles","description":"Devuelve páginas de 200 productos. Los filtros se combinan con AND; entre varias temáticas basta con coincidir con una (OR). El país incluye medios globales WW. Los rangos de precio y su ordenación usan el campo price personalizado del usuario, con descuentos y promociones y sin impuestos. Los límites de precio, DR y DA son inclusivos. El total y la paginación se calculan después de filtrar. Sin filtros se mantiene el listado completo. Solo se aceptan los parámetros documentados.","operationId":"listProducts","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["products:read"],"parameters":[{"name":"page","in":"query","description":"Página solicitada, de 200 productos.","schema":{"type":"integer","minimum":1,"maximum":1000000,"default":1}},{"name":"country","in":"query","description":"Código ISO de país, sin distinguir mayúsculas. Incluye ese país y WW. Omitirlo o indicar WW consulta todos los países.","schema":{"type":"string","pattern":"^[a-zA-Z]{2}$"},"example":"ES"},{"name":"topics[]","in":"query","description":"Identificadores del catálogo /catalog/topics. Repetir topics[]=24&topics[]=25 para buscar cualquiera de esas temáticas (OR).","style":"form","explode":true,"schema":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"integer","minimum":1}},"example":[24,25]},{"name":"price_min","in":"query","description":"Precio personalizado mínimo en EUR, sin impuestos. No puede superar price_max.","schema":{"type":"number","minimum":0,"maximum":100000000},"example":30},{"name":"price_max","in":"query","description":"Precio personalizado máximo en EUR, sin impuestos.","schema":{"type":"number","minimum":0,"maximum":100000000},"example":150},{"name":"dr_min","in":"query","description":"DR mínimo inclusivo. No puede superar dr_max. Un DR ausente se trata como 0, igual que en la respuesta.","schema":{"type":"number","minimum":0,"maximum":100},"example":40},{"name":"dr_max","in":"query","description":"DR máximo inclusivo.","schema":{"type":"number","minimum":0,"maximum":100},"example":100},{"name":"da_min","in":"query","description":"DA mínimo inclusivo. No puede superar da_max. Un DA ausente se trata como 0, igual que en la respuesta.","schema":{"type":"number","minimum":0,"maximum":100},"example":30},{"name":"da_max","in":"query","description":"DA máximo inclusivo.","schema":{"type":"number","minimum":0,"maximum":100},"example":80},{"name":"category","in":"query","description":"Categoría del medio; los productos adicionales heredan la categoría del medio base.","schema":{"type":"string","enum":["newspaper","blog"]}},{"name":"product_type","in":"query","description":"Modalidad del producto.","schema":{"type":"string","enum":["article-with-link","link-insertion","mention","mention-insertion"]}},{"name":"sort","in":"query","description":"Ordenación de todos los resultados antes de paginar. Los empates usan nombre e identificador interno para mantener un orden estable.","schema":{"type":"string","enum":["name_asc","price_asc","price_desc","dr_desc"],"default":"name_asc"}}],"x-sample-url":"https://shop.prensalink.com/api-external/v1/products?country=ES&topics%5B%5D=24&topics%5B%5D=25&price_max=150&dr_min=40&sort=price_asc&page=1","x-codeSamples":[{"lang":"curl","source":"curl --request GET \\\n  --url 'https://shop.prensalink.com/api-external/v1/products?country=ES&topics%5B%5D=24&topics%5B%5D=25&price_max=150&dr_min=40&sort=price_asc&page=1' \\\n  --header 'Authorization: Bearer plk_live_xxxxxxxxx'"}],"responses":{"200":{"description":"Página de productos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPageResponse"},"example":{"data":[{"url":"https://medio-ejemplo.com","publication_example":"https://medio-ejemplo.com/noticia-ejemplo","updated_at":"2026-09-10 10:30:00","base_price":120,"has_promo":false,"promo_price":120,"price":108,"category":"newspaper","product_type":"article-with-link","do_follow":true,"sponsored":false,"rel_sponsored":false,"in_home":true,"social_shared":false,"country":"es","language":"es","categories":["Salud","Belleza"],"num_links":2,"dr":52,"da":45,"tf":18,"cf":24,"traffic":12500,"keywords":3400,"conflict_topics":{"cbd":10},"estimated_publication_time":3}],"pagination":{"page":1,"page_size":200,"total":356,"last_page":2,"has_more":true,"next_page":2}}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/products/detail":{"get":{"tags":["Catálogo"],"summary":"Consultar productos de un medio por URL","description":"Devuelve una lista con los productos disponibles de una URL y sus precios personalizados. Sin product_type incluye todas las modalidades disponibles; con product_type devuelve solo la modalidad indicada, manteniendo data como lista. Admite URLs antiguas HTTP, www y barra final para localizar medios existentes, sin cambiar las reglas de alta de proveedores. Si no hay resultados devuelve 404. No se realizan peticiones HTTP a la URL recibida.","operationId":"getProductsByUrl","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["products:read"],"parameters":[{"name":"url","in":"query","required":true,"description":"URL del medio. Se envía codificada como parámetro de consulta. Admite HTTP o HTTPS sin credenciales, puerto, query ni fragmento.","schema":{"type":"string","format":"uri","maxLength":255},"example":"https://medio-ejemplo.com"},{"name":"product_type","in":"query","description":"Opcional. Si se omite, devuelve todos los tipos disponibles de ese medio.","schema":{"type":"string","enum":["article-with-link","link-insertion","mention","mention-insertion"]}}],"x-sample-url":"https://shop.prensalink.com/api-external/v1/products/detail?url=https%3A%2F%2Fmedio-ejemplo.com","x-codeSamples":[{"lang":"curl","source":"curl --request GET \\\n  --url 'https://shop.prensalink.com/api-external/v1/products/detail?url=https%3A%2F%2Fmedio-ejemplo.com' \\\n  --header 'Authorization: Bearer plk_live_xxxxxxxxx'"}],"responses":{"200":{"description":"Productos disponibles del medio. data siempre es una lista, incluso al indicar product_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDetailResponse"},"example":{"data":[{"url":"https://medio-ejemplo.com","publication_example":"https://medio-ejemplo.com/noticia-ejemplo","updated_at":"2026-10-05 10:30:00","base_price":120,"has_promo":false,"promo_price":120,"price":108,"category":"newspaper","product_type":"article-with-link","do_follow":true,"sponsored":false,"rel_sponsored":false,"in_home":true,"social_shared":false,"country":"es","language":"es","categories":["Salud","Belleza"],"num_links":2,"dr":52,"da":45,"tf":18,"cf":24,"traffic":12500,"keywords":3400,"conflict_topics":[],"estimated_publication_time":3},{"url":"https://medio-ejemplo.com","publication_example":"https://medio-ejemplo.com/noticia-ejemplo","updated_at":"2026-10-05 10:30:00","base_price":40,"has_promo":false,"promo_price":40,"price":36,"category":"newspaper","product_type":"mention","do_follow":true,"sponsored":false,"rel_sponsored":false,"in_home":true,"social_shared":false,"country":"es","language":"es","categories":["Salud","Belleza"],"num_links":2,"dr":52,"da":45,"tf":18,"cf":24,"traffic":12500,"keywords":3400,"conflict_topics":[],"estimated_publication_time":3}]}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"description":"No hay productos disponibles para la URL o modalidad solicitadas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"product_not_found","message":"No available products were found for this media URL and product type."}}}}},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/customer/cart":{"get":{"tags":["Carrito"],"summary":"Consultar el carrito","description":"Devuelve los productos del carrito, sus cantidades y precios personalizados actuales, junto con un resumen total.","operationId":"getCustomerCart","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.cart:write"],"x-codeSamples":[{"lang":"curl","source":"curl --request GET \\\n  --url 'https://shop.prensalink.com/api-external/v1/customer/cart' \\\n  --header 'Authorization: Bearer plk_live_xxxxxxxxx'"}],"responses":{"200":{"description":"Estado actual del carrito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerCartResponse"},"example":{"data":{"items":[{"url":"https://medio-ejemplo.com","category":"newspaper","product_type":"article-with-link","name":"Medio Ejemplo","quantity":2,"unit_price":108,"subtotal":216,"currency":"EUR"}],"summary":{"item_count":1,"total_quantity":2,"subtotal":216,"currency":"EUR"}}}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"429":{"$ref":"#/components/responses/RateLimited"}}},"delete":{"tags":["Carrito"],"summary":"Vaciar el carrito","description":"Elimina todos los productos del carrito. Es idempotente: si ya está vacío devuelve contadores a cero.","operationId":"clearCustomerCart","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.cart:write"],"x-codeSamples":[{"lang":"curl","source":"curl --request DELETE \\\n  --url 'https://shop.prensalink.com/api-external/v1/customer/cart' \\\n  --header 'Authorization: Bearer plk_live_xxxxxxxxx'"}],"responses":{"200":{"description":"Carrito vaciado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClearCustomerCartResponse"},"example":{"data":{"action":"cleared","removed_item_count":2,"removed_quantity":3}}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/customer/cart/items":{"post":{"tags":["Carrito"],"summary":"Añadir un producto al carrito","description":"Añade unidades de un producto al mismo carrito que utiliza el cliente en la tienda web. quantity indica cuántas unidades se suman en esta llamada, no la cantidad final. Las llamadas no son idempotentes: si se repite una petición, las unidades se vuelven a sumar. Para productos antiguos se aceptan también sus URLs históricas con http o barra final, siempre que el producto publicado exista.","operationId":"addCustomerCartItem","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.cart:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddCustomerCartItemRequest"},"example":{"url":"https://medio-ejemplo.com","product_type":"article-with-link","quantity":1}}}},"x-codeSamples":[{"lang":"curl","source":"curl --request POST \\\n  --url 'https://shop.prensalink.com/api-external/v1/customer/cart/items' \\\n  --header 'Authorization: Bearer plk_live_xxxxxxxxx' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\"url\":\"https://medio-ejemplo.com\",\"product_type\":\"article-with-link\",\"quantity\":1}'"}],"responses":{"200":{"description":"Unidades añadidas al carrito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddCustomerCartItemResponse"},"example":{"data":{"action":"added","added_quantity":1,"item":{"url":"https://medio-ejemplo.com","category":"newspaper","product_type":"article-with-link","name":"Medio Ejemplo","quantity":2,"unit_price":108,"subtotal":216,"currency":"EUR"}}}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"description":"No existe un producto publicado disponible para esa URL y tipo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"product_not_available","message":"El producto solicitado no está disponible."}}}}},"409":{"description":"La URL y el tipo no identifican un único producto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"ambiguous_product","message":"La URL y el tipo de producto no identifican un único producto."}}}}},"422":{"description":"La petición no cumple las reglas de validación o la cantidad total del producto superaría 500 unidades.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalid_request":{"value":{"error":{"code":"invalid_request","message":"The supplied data is invalid."}}},"quantity_limit":{"value":{"error":{"code":"cart_quantity_limit_exceeded","message":"La cantidad total de un producto en el carrito no puede superar 500 unidades."}}}}}}},"429":{"$ref":"#/components/responses/RateLimited"}}},"patch":{"tags":["Carrito"],"summary":"Establecer la cantidad de un producto","description":"Establece la cantidad final de un producto que ya existe en el carrito compartido. quantity igual a 0 elimina únicamente ese producto. Si la línea no existe devuelve cart_item_not_found; no se admiten cantidades negativas.","operationId":"setCustomerCartItemQuantity","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.cart:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCustomerCartItemRequest"},"example":{"url":"https://medio-ejemplo.com","product_type":"article-with-link","quantity":2}}}},"x-codeSamples":[{"lang":"curl","source":"curl --request PATCH \\\n  --url 'https://shop.prensalink.com/api-external/v1/customer/cart/items' \\\n  --header 'Authorization: Bearer plk_live_xxxxxxxxx' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\"url\":\"https://medio-ejemplo.com\",\"product_type\":\"article-with-link\",\"quantity\":2}'"}],"responses":{"200":{"description":"Cantidad establecida o producto eliminado del carrito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCustomerCartItemResponse"},"examples":{"updated":{"value":{"data":{"action":"updated","previous_quantity":4,"item":{"url":"https://medio-ejemplo.com","category":"newspaper","product_type":"article-with-link","name":"Medio Ejemplo","quantity":2,"unit_price":108,"subtotal":216,"currency":"EUR"}}}},"removed":{"value":{"data":{"action":"removed","previous_quantity":2,"current_quantity":0,"url":"https://medio-ejemplo.com","product_type":"article-with-link"}}}}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"description":"El producto no está disponible o no existe en el carrito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"cart_item_not_found":{"value":{"error":{"code":"cart_item_not_found","message":"El producto no existe en el carrito."}}},"product_not_available":{"value":{"error":{"code":"product_not_available","message":"El producto indicado no está disponible en el catálogo."}}}}}}},"409":{"description":"La URL y el tipo no identifican un único producto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/customer/cart/items/configuration":{"get":{"tags":["Configuración"],"summary":"Consultar la configuración de un producto del carrito","description":"Devuelve la configuración de cada unidad de un producto que ya está en el carrito, sus requisitos, las opciones disponibles y el precio personalizado. Los enlaces de un artículo escrito por el cliente se extraen del HTML de article.content. Las imágenes PNG, JPEG y WebP de Prensalink se conservan en su posición en article.content y se detallan en article.images.","operationId":"getCustomerCartItemConfiguration","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.cart:write"],"parameters":[{"name":"url","in":"query","required":true,"description":"URL del medio ya existente en el carrito. Se aceptan las URLs históricas con http o barra final de productos publicados.","schema":{"type":"string","format":"uri","maxLength":255},"example":"https://medio-ejemplo.com"},{"name":"product_type","in":"query","required":true,"schema":{"type":"string","enum":["article-with-link","link-insertion","mention","mention-insertion"]},"example":"article-with-link"}],"x-codeSamples":[{"lang":"curl","source":"curl --request GET --url 'https://shop.prensalink.com/api-external/v1/customer/cart/items/configuration?url=https%3A%2F%2Fmedio-ejemplo.com&product_type=article-with-link' --header 'Authorization: Bearer plk_live_xxxxxxxxx'"}],"responses":{"200":{"description":"Configuración, opciones y precios de cada unidad.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerCartItemConfigurationResponse"},"example":{"data":{"item":{"url":"https://medio-ejemplo.com","category":"newspaper","product_type":"article-with-link","name":"Medio Ejemplo","quantity":1},"configuration":{"status":"complete","configured_units":1,"total_units":1,"ready_for_order":true,"updated_at":"23-09-2026 11:15:10","units":[{"unit":1,"status":"complete","configure_later":false,"content_writer":"customer","links":[{"anchor_text":"mi marca","url":"https://mi-marca.example.com"}],"instructions":null,"publication_date":"30-09-2026","article":{"title":"Título del artículo","content":"<p>Conoce <a href=\"https://mi-marca.example.com\">mi marca</a></p>"},"addons":[],"conflict_topics":[],"validation_errors":[]}]},"requirements":{"links":{"minimum":1,"maximum":2},"content_writer":{"supported":true},"article":{"supported":true,"format":"html"},"existing_article_url":{"supported":false,"required":false,"same_media_domain":false},"brand_instructions":{"supported":false,"maximum_length":100},"publication_date":{"supported":true,"required":false},"configure_later":true},"available_options":{"content_writers":[{"value":"customer","name":"Cliente","additional_price":0,"currency":"EUR"}],"conflict_topics":[],"addons":[]},"pricing":{"unit_price":108,"base_subtotal":108,"selected_extras_subtotal":0,"total":108,"currency":"EUR"}}}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"description":"El producto no existe en el carrito o ya no está disponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"La URL y el tipo no identifican un único producto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}},"patch":{"tags":["Configuración"],"summary":"Configurar una unidad del carrito","description":"Actualiza parcialmente la configuración de una unidad (unit empieza en 1) de un producto que ya está en el carrito; los campos omitidos conservan su valor. Omite configure_later al configurar normalmente: empieza en false y solo debes enviar true para posponer o false para quitar una posposición previa. Si ya estaba en true, modificar otros campos no lo cambia; envía false para reanudar. En article-with-link y mention, si content_writer es customer, incluye los enlaces como etiquetas <a href=\"...\"> en article.content y no envíes configuration.links. Si escribe Prensalink o el medio, usa configuration.links. link-insertion acepta links y existing_article_url, pero no addons ni conflict_topics. La respuesta devuelve toda la configuración y sus errores de validación, si quedan campos pendientes.","operationId":"updateCustomerCartItemConfiguration","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.cart:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCustomerCartItemConfigurationRequest"},"examples":{"customerWrites":{"summary":"Cliente entrega el texto","value":{"url":"https://medio-ejemplo.com","product_type":"article-with-link","unit":1,"configuration":{"content_writer":"customer","article":{"title":"Título del artículo","content":"<p>Conoce <a href=\"https://mi-marca.example.com\">mi marca</a></p>"},"publication_date":"30-09-2026"}}},"prensalinkWrites":{"summary":"El texto lo redacta Prensalink","value":{"url":"https://medio-ejemplo.com","product_type":"article-with-link","unit":1,"configuration":{"content_writer":"prensalink","links":[{"anchor_text":"mi marca","url":"https://mi-marca.example.com"}],"instructions":"Enfocar el texto a pymes","publication_date":"30-09-2026"}}},"customerImages":{"summary":"Cliente entrega texto con imágenes","value":{"url":"https://medio-ejemplo.com","product_type":"article-with-link","unit":1,"configuration":{"content_writer":"customer","article":{"title":"Artículo con imágenes","content":"<p>Conoce <a href=\"https://mi-marca.example.com\">mi marca</a></p><img src=\"URL_DEVUELTA_POR_LA_SUBIDA\"><p>Continúa el artículo.</p>"}}}}}}}},"x-codeSamples":[{"lang":"curl","source":"curl --request PATCH --url 'https://shop.prensalink.com/api-external/v1/customer/cart/items/configuration' --header 'Authorization: Bearer plk_live_xxxxxxxxx' --header 'Content-Type: application/json' --data '{\"url\":\"https://medio-ejemplo.com\",\"product_type\":\"article-with-link\",\"unit\":1,\"configuration\":{\"content_writer\":\"customer\",\"article\":{\"title\":\"Título del artículo\",\"content\":\"<p>Conoce <a href=\\\"https://mi-marca.example.com\\\">mi marca</a></p>\"}}}'"}],"responses":{"200":{"description":"Configuración actualizada; tiene la misma estructura que GET.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerCartItemConfigurationResponse"}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"description":"El producto no existe en el carrito, la unidad no existe o el producto ya no está disponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"La URL y el tipo no identifican un único producto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Datos inválidos o campos no admitidos para este tipo de producto (invalid_request o invalid_configuration).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}},"delete":{"tags":["Configuración"],"summary":"Vaciar la configuración de una unidad del carrito","description":"Restablece solamente la configuración de la unidad indicada, comenzando por 1. El producto sigue en el carrito con la misma cantidad y las demás unidades conservan su configuración. No requiere body; envía url, product_type y unit en la URL. Si esa unidad ya está vacía, devuelve su estado actual sin modificarlo.","operationId":"resetCustomerCartItemConfiguration","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.cart:write"],"parameters":[{"name":"url","in":"query","required":true,"description":"URL del medio ya existente en el carrito. Se aceptan las URLs históricas con http o barra final de productos publicados.","schema":{"type":"string","format":"uri","maxLength":255},"example":"https://medio-ejemplo.com"},{"name":"product_type","in":"query","required":true,"schema":{"type":"string","enum":["article-with-link","link-insertion","mention","mention-insertion"]},"example":"article-with-link"},{"name":"unit","in":"query","required":true,"description":"Número de la unidad que se desea vaciar, comenzando por 1.","schema":{"type":"integer","minimum":1,"maximum":500},"example":2}],"x-codeSamples":[{"lang":"curl","source":"curl --request DELETE --url 'https://shop.prensalink.com/api-external/v1/customer/cart/items/configuration?url=https%3A%2F%2Fmedio-ejemplo.com&product_type=article-with-link&unit=2' --header 'Authorization: Bearer plk_live_xxxxxxxxx'"}],"responses":{"200":{"description":"Configuración actualizada; tiene la misma estructura que GET. La unidad vaciada pasa a status empty.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerCartItemConfigurationResponse"}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"description":"El producto no existe en el carrito, la unidad no existe o el producto ya no está disponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"La URL y el tipo no identifican un único producto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/customer/article-images":{"post":{"tags":["Configuración"],"operationId":"uploadCustomerArticleImage","summary":"Subir una imagen para un artículo","description":"- Archivo: un JPEG o PNG en image, mediante multipart/form-data. Sin SVG ni animación; el contenido se valida y recodifica.\n- Tamaño máximo: 3 MiB, 2048 píxeles por lado (2048 × 2048; 4.194.304 píxeles en total).\n- Uso: inserta <img src=\"URL_DEVUELTA\"> en configuration.article.content con content_writer customer (carrito o pedido).\n- Por artículo: hasta 5 imágenes, subidas por tu cuenta.\n- Conservación: las imágenes sin utilizar se eliminan a las 48 horas; las utilizadas se conservan.\n- Por cliente (todas sus claves): 10 subidas/minuto, 50 MiB/hora (incluye rechazos tras validar tamaño); hasta 100 imágenes o 100 MiB sin utilizar.\n- Por servidor: 30 subidas/minuto y 2 procesamientos simultáneos.\n- HTTP: ante 429, respeta Retry-After. Deja que el cliente multipart añada Content-Type y boundary.","security":[{"UserApiKey":[]}],"x-required-any-scopes":["customer.cart:write","customer.orders:write"],"x-public-rate-limits":["ip","credential","failed_authentication","image_upload_customer","image_upload_global"],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","additionalProperties":false,"required":["image"],"properties":{"image":{"type":"string","format":"binary","description":"Archivo JPEG o PNG de hasta 3 MiB; se comprueba su contenido real."}}}}}},"x-codeSamples":[{"lang":"curl","source":"curl --request POST --url 'https://shop.prensalink.com/api-external/v1/customer/article-images' --header 'Authorization: Bearer YOUR_API_KEY' --form 'image=@article-image.jpg'"}],"responses":{"201":{"description":"Imagen procesada. size es el tamaño final en bytes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerArticleUploadResponse"},"example":{"data":{"image_reference":"img_0123456789abcdef0123456789abcdef","url":"https://shop.prensalink.com/uploads/js-editor/api-img_0123456789abcdef0123456789abcdef.jpg","mime_type":"image/jpeg","size":125000,"width":1200,"height":800}}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"413":{"description":"Imagen original o procesada mayor de 3 MiB (image_too_large).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Archivo inválido, animado o dimensiones excesivas (invalid_request, invalid_image o invalid_image_dimensions).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Límite de peticiones, bytes por hora, imágenes sin utilizar o procesamiento ocupado. Respeta Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Segundos que se recomienda esperar.","schema":{"type":"integer"}}}},"503":{"description":"API en mantenimiento o almacenamiento no disponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/customer/checkout/context":{"get":{"tags":["Preparación del pedido"],"summary":"Consultar los datos necesarios para preparar un pedido","description":"Devuelve únicamente los perfiles de facturación del cliente autenticado, el perfil predeterminado, el saldo total actual (el mismo valor que muestra el panel de cliente) y los métodos de pago admitidos en la API. La disponibilidad para pagar se comprobará de nuevo al confirmar un pedido. No crea ni paga pedidos.","operationId":"getCustomerCheckoutContext","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.checkout:read"],"x-codeSamples":[{"lang":"curl","source":"curl --request GET --url 'https://shop.prensalink.com/api-external/v1/customer/checkout/context' --header 'Authorization: Bearer YOUR_API_KEY'"}],"responses":{"200":{"description":"Datos de preparación del pedido. No se almacenan en caché.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerCheckoutContextResponse"},"example":{"data":{"billing_profiles":[{"id":"123","type":"individual","name":"Ana","second_name":"García","fiscal_id":"12345678Z","address":"Calle Ejemplo 1","zip_code":"28001","locality":"Madrid","region":"Madrid","country_code":"ES"}],"default_billing_profile_id":"123","balance":{"amount":125.5,"currency":"EUR"},"payment_methods":["account_funds","bank_transfer"]}}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/customer/checkout/quote":{"post":{"tags":["Preparación del pedido"],"summary":"Calcular el presupuesto del carrito","description":"Calcula y guarda un presupuesto con quote_id, válido durante 15 minutos por defecto. Incluye productos, cantidades, configuración, precios, impuestos, perfil de facturación, método de pago y cupones. Todas las unidades deben estar configuradas o marcadas para configurar después. Los cupones y el comentario opcional se envían aquí, no al confirmar. Con account_funds, sufficient_balance indica si el saldo disponible alcanza; no reserva fondos. No crea pedidos, no cobra ni vacía el carrito. Conserva quote_id y expires_at para confirmar exactamente este presupuesto.","operationId":"quoteCustomerCart","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.checkout:read"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerCheckoutQuoteRequest"},"example":{"billing_profile_id":"123","payment_method":"bank_transfer","coupons":["DESCUENTO10"]}}}},"x-codeSamples":[{"lang":"curl","source":"curl --request POST --url 'https://shop.prensalink.com/api-external/v1/customer/checkout/quote' --header 'Authorization: Bearer YOUR_API_KEY' --header 'Content-Type: application/json' --data '{\"billing_profile_id\":\"123\",\"payment_method\":\"bank_transfer\",\"coupons\":[\"DESCUENTO10\"]}'"}],"responses":{"200":{"description":"Presupuesto persistido con quote_id y expires_at (DD-MM-YYYY HH:mm:ss, UTC). No modifica el carrito ni reserva fondos o precios.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerCheckoutQuoteResponse"},"example":{"data":{"quote_id":"quote_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","expires_at":"06-10-2026 12:15:00","items":[{"type":"product","name":"Medio Ejemplo","quantity":1,"unit_price":121,"subtotal":121},{"type":"coupon","name":"Descuento DESCUENTO10","quantity":1,"unit_price":-12.1,"subtotal":-12.1}],"billing_profile_id":"123","payment_method":"bank_transfer","payment_fees":0,"vat_rate":0.21,"vat_amount":18.9,"total_without_taxes":90,"total":108.9,"currency":"EUR"}}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"description":"El perfil de facturación no existe en la cuenta autenticada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Petición inválida, carrito vacío, configuración no apta o cupón inexistente, caducado o incompatible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/customer/orders":{"get":{"tags":["Pedidos"],"summary":"Listar mis pedidos","description":"Lista los pedidos visibles para el cliente autenticado, incluidos los realizados desde la web. Se pagina por número de pedido descendente. status filtra por un único estado. No modifica pedidos ni incluye IDs internos.","operationId":"listCustomerOrders","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.orders:read"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"maximum":1000000,"default":1}},{"name":"page_size","in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":25}},{"name":"status","in":"query","schema":{"type":"string","enum":["pending","in_progress","completed","cancelled"]}}],"x-codeSamples":[{"lang":"curl","source":"curl --request GET --url 'https://shop.prensalink.com/api-external/v1/customer/orders?page=1&page_size=25&status=in_progress' --header 'Authorization: Bearer YOUR_API_KEY'"}],"responses":{"200":{"description":"Página de pedidos propios. No se almacena en caché.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerOrderPageResponse"},"example":{"data":[{"order_number":"880001","status":"in_progress","payment_method":"account_funds","items_count":1,"total":121,"currency":"EUR","created_at":"24-09-2026 10:30:00"}],"pagination":{"page":1,"page_size":25,"total":1,"last_page":1,"has_more":false,"next_page":null}}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"tags":["Pedidos"],"summary":"Confirmar un pedido con saldo o transferencia","description":"Confirma exclusivamente el quote_id devuelto por POST /customer/checkout/quote. No envíes de nuevo perfil, método de pago, cupones, comentario ni importes. Si ha caducado devuelve quote_expired (409); si cambia el carrito, su configuración o las condiciones económicas devuelve quote_changed (409): solicita y revisa otro presupuesto. Estos errores no crean pedidos, no cobran ni vacían el carrito. Con account_funds el cargo se completa en esta petición; si el saldo no alcanza devuelve 402 y puedes recargar y reintentar mientras el presupuesto siga vigente y sin cambios. Con bank_transfer devuelve instrucciones bancarias. Idempotency-Key sigue siendo obligatoria: misma clave y cuerpo recuperan la respuesta durante 30 días; otro cuerpo devuelve 409. Un quote_id ya confirmado devuelve siempre el pedido original, incluso con otra clave o después de caducar, sin cobrar de nuevo ni vaciar un carrito nuevo. Todas las API keys de la cuenta comparten 5 intentos nuevos/minuto, 10 pedidos API/hora y como máximo 10 transferencias API sin pagar. Recuperar un pedido ya confirmado no consume estos cupos; los límites generales de la API sí siguen aplicándose.","operationId":"createCustomerOrder","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication","customer_order_attempts","customer_orders_created","customer_pending_bank_transfers"],"x-required-scopes":["customer.orders:write"],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Clave única por intento de pedido. Entre 1 y 255 caracteres ASCII visibles, sin espacios; recomendamos un UUID. La respuesta se conserva 30 días.","schema":{"type":"string","minLength":1,"maxLength":255},"example":"7b41e836-9575-4db6-a19f-a21012b19ee2"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerOrderPlacementRequest"},"example":{"quote_id":"quote_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}}}},"x-codeSamples":[{"lang":"curl","source":"curl --request POST --url 'https://shop.prensalink.com/api-external/v1/customer/orders' --header 'Authorization: Bearer YOUR_API_KEY' --header 'Idempotency-Key: 7b41e836-9575-4db6-a19f-a21012b19ee2' --header 'Content-Type: application/json' --data '{\"quote_id\":\"quote_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"}'"}],"responses":{"201":{"description":"Pedido confirmado. Con saldo, payment.status es completed porque el cargo ya se ha realizado. Con transferencia, se devuelven las instrucciones bancarias. Idempotency-Replayed indica si se devolvió la respuesta original.","headers":{"Idempotency-Replayed":{"$ref":"#/components/headers/IdempotencyReplayed"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerOrderPlacementResponse"},"example":{"data":{"order_number":"880001","status":"pending","payment_method":"account_funds","total":108.9,"currency":"EUR","payment":{"status":"completed"}}}}}},"400":{"description":"Falta Idempotency-Key o su formato no es válido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"description":"El presupuesto no existe, se ha eliminado por caducidad o pertenece a otro cliente (quote_not_found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Presupuesto caducado (quote_expired), carrito o condiciones modificadas (quote_changed), clave reutilizada con otro cuerpo, petición en curso o límite de transferencias pendientes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"pending_transfers":{"value":{"error":{"code":"pending_bank_transfer_limit_reached","message":"Ya tienes demasiados pedidos por transferencia pendientes de pago."}}},"quote_changed":{"value":{"error":{"code":"quote_changed","message":"El carrito o las condiciones del presupuesto han cambiado. Solicita un nuevo presupuesto antes de confirmar."}}},"quote_expired":{"value":{"error":{"code":"quote_expired","message":"El presupuesto ha caducado. Solicita uno nuevo antes de confirmar."}}}}}}},"402":{"description":"Saldo insuficiente o fallo en el cobro. No se crea el pedido ni se vacía el carrito.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Falta quote_id, su formato es incorrecto o se han enviado campos no admitidos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Límite general de la API, de 5 intentos de pedido por minuto o de 10 pedidos creados por hora superado. Retry-After indica cuándo reintentar.","headers":{"Retry-After":{"description":"Segundos hasta poder reintentar.","schema":{"type":"integer"}},"X-Order-RateLimit-Limit":{"description":"Límite de pedidos o intentos que ha bloqueado la operación.","schema":{"type":"integer"}},"X-Order-RateLimit-Scope":{"description":"Indica el cupo de pedidos agotado.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"attempts":{"value":{"error":{"code":"customer_order_attempt_limit_exceeded","message":"Se ha superado el límite de intentos de creación de pedidos. Inténtalo más tarde."}}},"created_orders":{"value":{"error":{"code":"customer_order_hourly_limit_exceeded","message":"Se ha superado el límite de pedidos creados por hora. Inténtalo más tarde."}}}}}}}}}},"/customer/orders/{orderNumber}":{"get":{"tags":["Pedidos"],"summary":"Consultar un pedido propio","description":"Consulta un pedido por su número público. Devuelve sus unidades, cupones, configuración, artículo completo cuando ya existe y URLs de publicación cuando están disponibles. Cada unidad incluye una referencia pública estable, su estado de configuración y si admite la configuración inicial. El artículo incluye review_status y can_review para indicar si espera una decisión del cliente. El contenido se devuelve como HTML saneado y no puede editarse por esta API. Si el pedido pertenece a otra cuenta, responde 404. Las imágenes PNG, JPEG y WebP de Prensalink se conservan en su posición en article.content y se detallan en article.images.","operationId":"getCustomerOrder","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.orders:read"],"parameters":[{"name":"orderNumber","in":"path","required":true,"description":"Número público del pedido devuelto por el listado o por la creación de pedidos.","schema":{"type":"string","maxLength":100},"example":"880001"}],"x-codeSamples":[{"lang":"curl","source":"curl --request GET --url 'https://shop.prensalink.com/api-external/v1/customer/orders/880001' --header 'Authorization: Bearer YOUR_API_KEY'"}],"responses":{"200":{"description":"Detalle del pedido. No se almacena en caché.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerOrderDetailResponse"},"example":{"data":{"order_number":"880001","status":"in_progress","payment_method":"account_funds","items_count":1,"total":108.9,"currency":"EUR","created_at":"24-09-2026 10:30:00","total_without_taxes":90,"vat_rate":0.21,"vat_amount":18.9,"payment_fees":0,"coupons":[{"code":"DESCUENTO10","amount_discount":12.1}],"items":[{"item_reference":"itm_13c955b20e5fdcba17f31d973c423fad","unit":1,"name":"Medio Ejemplo","media_url":"https://medio-ejemplo.com","product_type":"article-with-link","category":"newspaper","is_cancelled":false,"price":121,"configuration_status":"configured","can_configure":false,"configuration":{"content_writer":"prensalink","instructions":"Enfocar el texto a pymes","links":[{"anchor_text":"mi marca","url":"https://mi-marca.example.com"}],"publication_date":null,"existing_article_url":null,"brand_instructions":null},"article":{"title":"Título del artículo","content":"<p>Contenido del artículo</p><img src=\"https://shop.prensalink.com/api-external/v1/customer/article-images/IMAGE_REFERENCE?expires=1790856000&amp;signature=SIGNED_SIGNATURE\" alt=\"Imagen del artículo\">","content_format":"html","status":"completed","review_status":"approved","can_review":false,"instructions":"Enfocar el texto a pymes","images":[{"available":true,"url":"https://shop.prensalink.com/api-external/v1/customer/article-images/IMAGE_REFERENCE?expires=1790856000&signature=SIGNED_SIGNATURE","expires_at":"01-10-2026 13:00:00","message":null},{"available":false,"url":null,"expires_at":null,"message":"Imagen no disponible."}]},"publication_urls":["https://medio-ejemplo.com/articulo"],"addons":[],"attributes":[]}]}}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"description":"El pedido no existe o no pertenece al cliente autenticado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"order_not_found","message":"El pedido no existe en tu cuenta."}}}}},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/customer/article-images/{imageReference}":{"get":{"tags":["Pedidos"],"summary":"Descargar una imagen del artículo","description":"Utiliza exactamente la URL recibida en article.images o en el src del HTML, sin reconstruirla ni modificar sus parámetros. No necesita Authorization: el enlace firmado permite descargar esa imagen durante una hora. No lo compartas públicamente. expires_at indica su caducidad; si caduca, vuelve a consultar el artículo con tu API key. Si el artículo cambia o desaparece, su enlace anterior deja de funcionar.","operationId":"downloadCustomerArticleImage","security":[],"x-signed-url":true,"x-sample-url":"IMAGE_DOWNLOAD_URL","x-public-rate-limits":["ip"],"parameters":[{"name":"imageReference","in":"path","required":true,"description":"Referencia opaca incluida en la URL firmada. No debe generarse ni modificarse.","schema":{"type":"string","maxLength":2048}},{"name":"expires","in":"query","required":true,"description":"Caducidad incluida en la URL; no modificar.","schema":{"type":"integer"}},{"name":"signature","in":"query","required":true,"description":"Firma incluida en la URL; no modificar.","schema":{"type":"string"}}],"x-codeSamples":[{"lang":"curl","source":"curl --request GET --url 'IMAGE_DOWNLOAD_URL' --output article-image"}],"responses":{"200":{"description":"Bytes originales de la imagen. No se almacena en caché; la extensión depende de Content-Type.","content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"403":{"description":"Enlace inválido o caducado; consultar de nuevo el artículo para renovarlo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_image_link","message":"El enlace de la imagen es inválido o ha caducado. Consulta de nuevo el artículo para obtener otro."}}}}},"404":{"description":"La imagen ya no está disponible o cambió el contenido del artículo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"article_image_unavailable","message":"Imagen no disponible."}}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/customer/orders/{orderNumber}/items/{itemReference}/configuration":{"patch":{"tags":["Pedidos"],"summary":"Configurar una unidad pendiente de un pedido","description":"Completa por primera vez una unidad sin configuración de un pedido propio. Usa item_reference del detalle del pedido. Admite los mismos campos públicos de configuración que el carrito para cada tipo de producto, excepto configure_later, addons y conflict_topics: después de comprar no se pueden añadir ni cambiar opciones de pago. El pedido debe estar formalizado, no finalizado ni cancelado, y la unidad no puede estar cancelada ni configurada. Los packs de varios medios siguen configurándose desde el panel. Pedido y artículo aportado por el cliente se guardan en una transacción. Una segunda configuración de la misma unidad devuelve 409.","operationId":"configureCustomerOrderItem","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.orders:write"],"parameters":[{"name":"orderNumber","in":"path","required":true,"description":"Número público del pedido.","schema":{"type":"string","maxLength":100},"example":"880001"},{"name":"itemReference","in":"path","required":true,"description":"item_reference de la unidad devuelto por GET /customer/orders/{orderNumber}.","schema":{"type":"string","pattern":"^itm_[a-f0-9]{32}$"},"example":"itm_13c955b20e5fdcba17f31d973c423fad"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigureCustomerOrderItemRequest"},"example":{"configuration":{"content_writer":"prensalink","links":[{"anchor_text":"mi marca","url":"https://mi-marca.example.com"}],"instructions":"Enfocar el artículo a pymes."}}}}},"x-codeSamples":[{"lang":"curl","source":"curl --request PATCH --url 'https://shop.prensalink.com/api-external/v1/customer/orders/880001/items/itm_13c955b20e5fdcba17f31d973c423fad/configuration' --header 'Authorization: Bearer YOUR_API_KEY' --header 'Content-Type: application/json' --data '{\"configuration\":{\"content_writer\":\"prensalink\",\"links\":[{\"anchor_text\":\"mi marca\",\"url\":\"https://mi-marca.example.com\"}]}}'"}],"responses":{"200":{"description":"Unidad configurada. La respuesta no se almacena en caché.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigureCustomerOrderItemResponse"},"example":{"data":{"order_number":"880001","item_reference":"itm_13c955b20e5fdcba17f31d973c423fad","configuration_status":"configured","can_configure":false}}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"description":"El pedido no pertenece al cliente o la unidad no existe en ese pedido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"La unidad ya está configurada, el pedido no admite cambios o se trata de un pack.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/customer/orders/{orderNumber}/items/{itemReference}/article/review":{"post":{"tags":["Pedidos"],"summary":"Aprobar un artículo o solicitar cambios","description":"Registra la decisión del cliente sobre un artículo entregado que esté awaiting_approval. Usa orderNumber e itemReference del detalle del pedido. approve inicia el circuito de publicación y request_changes requiere un comentario; ambos reutilizan el flujo de revisión del panel. La respuesta confirma la decisión, no que la cola haya terminado ni que el artículo esté publicado. El contenido del artículo no puede editarse mediante esta API. Una segunda decisión sobre la misma entrega devuelve 409.","operationId":"reviewCustomerOrderArticle","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.orders:write"],"parameters":[{"name":"orderNumber","in":"path","required":true,"description":"Número público del pedido.","schema":{"type":"string","maxLength":100},"example":"880001"},{"name":"itemReference","in":"path","required":true,"description":"item_reference de la unidad devuelto por GET /customer/orders/{orderNumber}.","schema":{"type":"string","pattern":"^itm_[a-f0-9]{32}$"},"example":"itm_13c955b20e5fdcba17f31d973c423fad"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewCustomerOrderArticleRequest"},"examples":{"approve":{"summary":"Aprobar","value":{"action":"approve"}},"request_changes":{"summary":"Solicitar cambios","value":{"action":"request_changes","comment":"Corrige el segundo párrafo y mantén el enlace."}}}}}},"x-codeSamples":[{"lang":"curl","source":"curl --request POST --url 'https://shop.prensalink.com/api-external/v1/customer/orders/880001/items/itm_13c955b20e5fdcba17f31d973c423fad/article/review' --header 'Authorization: Bearer YOUR_API_KEY' --header 'Content-Type: application/json' --data '{\"action\":\"approve\"}'"}],"responses":{"200":{"description":"Decisión registrada; el trabajo posterior puede seguir pendiente en la cola. No se almacena en caché.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewCustomerOrderArticleResponse"},"example":{"data":{"order_number":"880001","item_reference":"itm_13c955b20e5fdcba17f31d973c423fad","review_status":"approved","can_review":false}}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"description":"El pedido no pertenece al cliente o la unidad no tiene un artículo propio.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"El artículo no está pendiente de aprobación o no puede procesarse su revisión.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/customer/invoices":{"get":{"tags":["Facturas"],"summary":"Listar mis facturas","description":"Lista las facturas ya registradas del cliente, incluidas las de recargas y las de pedidos cuando existan. No crea facturas nuevas. pdf_available indica si el PDF se puede descargar; mientras sea false, download_url es null. El listado se pagina por fecha de registro descendente y no incluye datos fiscales ni IDs internos.","operationId":"listCustomerInvoices","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.invoices:read"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"maximum":1000000,"default":1}},{"name":"page_size","in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":25}}],"x-codeSamples":[{"lang":"curl","source":"curl --request GET --url 'https://shop.prensalink.com/api-external/v1/customer/invoices?page=1&page_size=25' --header 'Authorization: Bearer YOUR_API_KEY'"}],"responses":{"200":{"description":"Página de facturas propias. No se almacena en caché.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerInvoicePageResponse"},"example":{"data":[{"invoice_number":"PL-123","invoice_date":"29-09-2026","description":"Factura de recarga","order_number":null,"total":121,"currency":"EUR","pdf_available":true,"download_url":"/api-external/v1/customer/invoices/PL-123/download"}],"pagination":{"page":1,"page_size":25,"total":1,"last_page":1,"has_more":false,"next_page":null}}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/customer/invoices/{invoiceNumber}/download":{"get":{"tags":["Facturas"],"summary":"Descargar una factura en PDF","description":"Descarga un PDF existente usando el invoice_number obtenido en el listado. Debe pertenecer al cliente autenticado y tener pdf_available true. El archivo se entrega como adjunto y no se almacena en caché. La solicitud requiere Authorization: Bearer; download_url no es un enlace público.","operationId":"downloadCustomerInvoice","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.invoices:read"],"parameters":[{"name":"invoiceNumber","in":"path","required":true,"description":"invoice_number de una factura propia devuelto por GET /customer/invoices.","schema":{"type":"string","maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$"},"example":"PL-123"}],"x-codeSamples":[{"lang":"curl","source":"curl --request GET --url 'https://shop.prensalink.com/api-external/v1/customer/invoices/PL-123/download' --header 'Authorization: Bearer YOUR_API_KEY' --output PL-123.pdf"}],"responses":{"200":{"description":"PDF de la factura.","headers":{"Content-Disposition":{"description":"Adjunto con el nombre de la factura.","schema":{"type":"string"}}},"content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"description":"Factura ajena, inexistente o PDF todavía no disponible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/customer/billing-profiles":{"post":{"tags":["Preparación del pedido"],"summary":"Crear un perfil de facturación","description":"Crea un perfil para el cliente autenticado. En España, region acepta el id o el nombre de /catalog/regions?country=ES; se devuelve el nombre. Un perfil individual no admite vat_id. No cambia el perfil predeterminado explícito.","operationId":"createCustomerBillingProfile","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.billing:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerBillingProfileCreateRequest"},"example":{"type":"individual","name":"Ana","second_name":"García","fiscal_id":"12345678Z","address":"Calle Ejemplo 1","zip_code":"28001","locality":"Madrid","country_code":"ES","region":"Madrid"}}}},"x-codeSamples":[{"lang":"curl","source":"curl --request POST --url 'https://shop.prensalink.com/api-external/v1/customer/billing-profiles' --header 'Authorization: Bearer YOUR_API_KEY' --header 'Content-Type: application/json' --data '{\"type\":\"individual\",\"name\":\"Ana\",\"second_name\":\"García\",\"fiscal_id\":\"12345678Z\",\"address\":\"Calle Ejemplo 1\",\"zip_code\":\"28001\",\"locality\":\"Madrid\",\"country_code\":\"ES\",\"region\":\"Madrid\"}'"}],"responses":{"201":{"description":"Perfil creado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerBillingProfileResponse"}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/customer/billing-profiles/{profileId}":{"patch":{"tags":["Preparación del pedido"],"summary":"Modificar un perfil de facturación propio","description":"Modifica solo los campos enviados. El perfil debe pertenecer al cliente autenticado. En España, region acepta el id o el nombre de /catalog/regions?country=ES. No modifica el perfil predeterminado.","operationId":"updateCustomerBillingProfile","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["customer.billing:write"],"parameters":[{"name":"profileId","in":"path","required":true,"description":"Identificador del perfil devuelto por el contexto o al crearlo.","schema":{"type":"string"},"example":"123"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerBillingProfileUpdateRequest"},"example":{"address":"Calle Nueva 2","zip_code":"28002"}}}},"x-codeSamples":[{"lang":"curl","source":"curl --request PATCH --url 'https://shop.prensalink.com/api-external/v1/customer/billing-profiles/123' --header 'Authorization: Bearer YOUR_API_KEY' --header 'Content-Type: application/json' --data '{\"address\":\"Calle Nueva 2\",\"zip_code\":\"28002\"}'"}],"responses":{"200":{"description":"Perfil actualizado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerBillingProfileResponse"}}}},"401":{"$ref":"#/components/responses/InvalidUserApiKey"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"description":"El perfil no existe en la cuenta autenticada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/catalog/countries":{"get":{"tags":["Valores Auxiliares"],"summary":"Listar países","operationId":"listCountries","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"parameters":[{"$ref":"#/components/parameters/Language"}],"x-codeSamples":[{"lang":"curl","source":"curl --request GET \\\n  --url 'https://shop.prensalink.com/api-external/v1/catalog/countries?language=es' \\\n  --header 'Authorization: Bearer YOUR_API_KEY'"}],"responses":{"200":{"description":"Países disponibles.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountriesResponse"},"example":{"data":[{"code":"ES","name":"España"},{"code":"WW","name":"Todo el mundo"}]}}}},"401":{"$ref":"#/components/responses/InvalidCatalogCredential"},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/catalog/regions":{"get":{"tags":["Valores Auxiliares"],"summary":"Listar regiones de un país","operationId":"listRegions","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"parameters":[{"$ref":"#/components/parameters/Country"}],"x-codeSamples":[{"lang":"curl","source":"curl --request GET \\\n  --url 'https://shop.prensalink.com/api-external/v1/catalog/regions?country=ES' \\\n  --header 'Authorization: Bearer YOUR_API_KEY'"}],"responses":{"200":{"description":"Regiones disponibles.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegionsResponse"},"example":{"data":[{"id":"64","name":"Todas las regiones","country":"ES"}]}}}},"401":{"$ref":"#/components/responses/InvalidCatalogCredential"},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/catalog/topics":{"get":{"tags":["Valores Auxiliares"],"summary":"Listar temáticas","operationId":"listTopics","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"parameters":[{"$ref":"#/components/parameters/Language"}],"x-codeSamples":[{"lang":"curl","source":"curl --request GET \\\n  --url 'https://shop.prensalink.com/api-external/v1/catalog/topics?language=es' \\\n  --header 'Authorization: Bearer YOUR_API_KEY'"}],"responses":{"200":{"description":"Temáticas disponibles.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicsResponse"},"example":{"data":[{"id":"24","name":"Salud y belleza"}]}}}},"401":{"$ref":"#/components/responses/InvalidCatalogCredential"},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/catalog/conflict-topics":{"get":{"tags":["Valores Auxiliares"],"summary":"Listar temáticas conflictivas","operationId":"listConflictTopics","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-codeSamples":[{"lang":"curl","source":"curl --request GET \\\n  --url 'https://shop.prensalink.com/api-external/v1/catalog/conflict-topics' \\\n  --header 'Authorization: Bearer YOUR_API_KEY'"}],"responses":{"200":{"description":"Temáticas conflictivas y precio mínimo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictTopicsResponse"},"example":{"data":[{"slug":"cbd","name":"CBD","minimum_price":0},{"slug":"sexo","name":"Sexo","minimum_price":0}]}}}},"401":{"$ref":"#/components/responses/InvalidCatalogCredential"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/catalog/product-types":{"get":{"tags":["Valores Auxiliares"],"summary":"Listar tipos de producto","description":"Valores válidos para product_type en la modificación individual de medios.","operationId":"listProductTypes","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-codeSamples":[{"lang":"curl","source":"curl --request GET \\\n  --url 'https://shop.prensalink.com/api-external/v1/catalog/product-types' \\\n  --header 'Authorization: Bearer YOUR_API_KEY'"}],"responses":{"200":{"description":"Tipos de producto públicos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductTypesResponse"},"example":{"data":[{"product_type":"article-with-link","name":"Artículo con enlace","minimum_price":10},{"product_type":"link-insertion","name":"Inserción de enlaces","minimum_price":10},{"product_type":"mention","name":"Mención","minimum_price":10},{"product_type":"mention-insertion","name":"Inserción de mención","minimum_price":10}]}}}},"401":{"$ref":"#/components/responses/InvalidCatalogCredential"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/provider/media":{"get":{"tags":["Gestión de Medios"],"summary":"Listar los medios del proveedor","description":"Devuelve páginas de 50 medios. La paginación se aplica antes de cargar sus productos base y adicionales.","operationId":"listProviderMedia","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["provider.media:read"],"parameters":[{"$ref":"#/components/parameters/Page"}],"x-codeSamples":[{"lang":"curl","source":"curl --request GET \\\n  --url 'https://shop.prensalink.com/api-external/v1/provider/media?page=1' \\\n  --header 'Authorization: Bearer plk_live_provider_xxxxxxxxx'"}],"responses":{"200":{"description":"Página de 50 medios del proveedor agrupados por URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderMediaPageResponse"},"example":{"data":[{"url":"https://medio-ejemplo.com","category":"newspaper","product_type":"article-with-link","name":"Diario Ejemplo","price":50,"active":true,"accept_conflicts_topics":false,"conflict_topics":[],"language":"es","countries":["es"],"topics":["Salud","Tecnología"],"num_links":2,"publication_example":"https://medio-ejemplo.com/noticia-ejemplo","additional_comments":"Se publica en portada","in_home":true,"has_social":true,"is_sponsored":false,"do_follow":true,"rel_sponsored":false,"additional_products":{"link-insertion":{"active":true,"price":35,"updated_at":"2026-09-10T13:01:19+00:00"},"mention":null,"mention-insertion":null},"updated_at":"2026-09-10T13:00:00+00:00"},{"url":"https://blog-ejemplo.com","category":"blog","product_type":"article-with-link","name":"Blog Ejemplo","price":30,"active":true,"accept_conflicts_topics":true,"conflict_topics":{"cbd":10},"language":"es","countries":["es","mx"],"topics":["Marketing"],"num_links":1,"publication_example":"https://blog-ejemplo.com/articulo-ejemplo","additional_comments":null,"in_home":false,"has_social":false,"is_sponsored":true,"do_follow":false,"rel_sponsored":true,"additional_products":{"link-insertion":null,"mention":{"active":false,"price":25,"updated_at":"2026-09-09T10:15:00+00:00"},"mention-insertion":null},"updated_at":"2026-09-09T10:15:00+00:00"}],"pagination":{"page":1,"page_size":50,"total":2,"last_page":1,"has_more":false,"next_page":null}}}}},"401":{"$ref":"#/components/responses/InvalidProviderCredentials"},"403":{"$ref":"#/components/responses/ProviderForbidden"},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"tags":["Gestión de Medios"],"summary":"Crear un medio","description":"Crea una solicitud de alta del producto base (artículo con enlace) y, opcionalmente, de sus productos adicionales (inserción de enlace, mención, etc.). Se aplican aprobaciones para estas altas.","operationId":"createProviderMedia","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["provider.media:write"],"x-public-excluded-parameters":["Idempotency-Key"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMediaRequest"},"example":{"base_product":{"name":"Diario Ejemplo","price":50,"active":true,"url":"https://medio-ejemplo.com","category":"newspaper","languages":["es"],"regions":["64"],"topics":["24"],"contact_email":"contacto@example.com","submission_email":"envios@example.com","publication_example":"https://medio-ejemplo.com/noticia-ejemplo","additional_comments":"Se publica en portada","num_links":2,"accept_conflicts_topics":true,"conflict_topics":{"cbd":{"price":10},"sexo":{"price":0}},"extra_home":false,"extra_social":true,"extra_sponsor":false,"extra_dofollow":true,"extra_relsponsor":false},"additional_products":{"mention":{"price":30,"active":true}}}}}},"x-codeSamples":[{"lang":"curl","source":"curl --request POST \\\n  --url 'https://shop.prensalink.com/api-external/v1/provider/media' \\\n  --header 'Authorization: Bearer plk_live_provider_xxxxxxxxx' \\\n  --header 'Content-Type: application/json' \\\n  --data @medio.json"}],"responses":{"201":{"description":"Medio creado y aprobado.","headers":{"Idempotency-Replayed":{"$ref":"#/components/headers/IdempotencyReplayed"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMediaResponse"}}}},"202":{"description":"Solicitud de alta registrada y pendiente de aprobación.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMediaResponse"}}}},"400":{"$ref":"#/components/responses/InvalidIdempotencyKey"},"401":{"$ref":"#/components/responses/InvalidProviderCredentials"},"403":{"$ref":"#/components/responses/ProviderForbidden"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"description":"No se ha podido comprobar temporalmente el Domain Rating del medio.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["Gestión de Medios"],"summary":"Modificar un producto del medio","description":"La URL localiza el medio y nunca se modifica. Si product_type no se indica, se utiliza article-with-link. Una subida de precio directa queda pendiente de aprobación; las bajadas y el resto de campos se aplican inmediatamente.","operationId":"updateProviderMedia","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication"],"x-required-scopes":["provider.media:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMediaRequest"},"example":{"url":"https://medio-ejemplo.com","product_type":"mention","price":35,"active":false}}}},"x-codeSamples":[{"lang":"curl","source":"curl --request PATCH \\\n  --url 'https://shop.prensalink.com/api-external/v1/provider/media' \\\n  --header 'Authorization: Bearer plk_live_provider_xxxxxxxxx' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\"url\":\"https://medio-ejemplo.com\",\"product_type\":\"mention\",\"price\":35,\"active\":false}'"}],"responses":{"200":{"description":"Modificación aplicada o solicitud de subida de precio registrada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMediaResponse"}}}},"401":{"$ref":"#/components/responses/InvalidProviderCredentials"},"403":{"$ref":"#/components/responses/ProviderForbidden"},"404":{"$ref":"#/components/responses/MediaNotFound"},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/provider/media/bulk/validate":{"post":{"tags":["Gestión de Medios en Bulk"],"summary":"Validar un lote de medios","description":"Analiza hasta 100 medios y anticipa si cada elemento se creará, actualizará o producirá un error. No realiza cambios. Requiere que el proveedor tenga habilitada la subida bulk. Se aplican límites independientes por número de peticiones y por número total de elementos procesados.","operationId":"validateProviderMediaBulk","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication","bulk_validate_requests","bulk_validate_items","bulk_global_requests","bulk_global_items"],"x-required-scopes":["provider.media:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMediaRequest"},"example":{"items":[{"reference":"MEDIA-001","base_product":{"name":"Diario Salud","price":50,"url":"https://bulk-salud.example.com","category":"newspaper","languages":["es"],"regions":["64"],"topics":["24"],"submission_email":"salud@example.com","publication_example":"https://bulk-salud.example.com/noticia"},"additional_products":{"link-insertion":{"price":40,"active":true}}},{"reference":"MEDIA-002","base_product":{"name":"Blog Tecnología","price":35,"url":"https://bulk-tecnologia.example.com","category":"blog","languages":["en"],"regions":["64"],"topics":["25"],"submission_email":"tech@example.com","publication_example":"https://bulk-tecnologia.example.com/article"},"additional_products":{"mention":{"price":25,"active":false}}},{"reference":"MEDIA-003","base_product":{"name":"Revista Viajes","price":70,"url":"https://bulk-viajes.example.com","category":"newspaper","languages":["es"],"regions":["64"],"topics":["26"],"submission_email":"viajes@example.com","publication_example":"https://bulk-viajes.example.com/reportaje"},"additional_products":{"mention-insertion":{"price":20,"active":true}}}]}}}},"x-codeSamples":[{"lang":"curl","source":"curl --request POST \\\n  --url 'https://shop.prensalink.com/api-external/v1/provider/media/bulk/validate' \\\n  --header 'Authorization: Bearer plk_live_provider_xxxxxxxxx' \\\n  --header 'Content-Type: application/json' \\\n  --data @lote.json"}],"responses":{"200":{"description":"Resultado de validación sin escrituras.","headers":{"X-Bulk-RateLimit-Requests-Limit":{"$ref":"#/components/headers/BulkRequestsLimit"},"X-Bulk-RateLimit-Requests-Remaining":{"$ref":"#/components/headers/BulkRequestsRemaining"},"X-Bulk-RateLimit-Items-Limit":{"$ref":"#/components/headers/BulkItemsLimit"},"X-Bulk-RateLimit-Items-Remaining":{"$ref":"#/components/headers/BulkItemsRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMediaResponse"},"example":{"data":{"mode":"validation","summary":{"total":1,"create":1,"update":0,"unchanged":0,"errors":0},"items":[{"index":0,"reference":"MEDIA-001","url":"https://bulk-ejemplo.com","status":"ready","action":"create"}]}}}}},"401":{"$ref":"#/components/responses/InvalidProviderCredentials"},"403":{"$ref":"#/components/responses/ProviderForbidden"},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/provider/media/bulk":{"post":{"tags":["Gestión de Medios en Bulk"],"summary":"Crear o actualizar un lote de medios","description":"Procesa de forma independiente hasta 100 elementos. Los errores de un medio no revierten los elementos correctos. La URL determina si se crea, actualiza o devuelve conflicto. Se pueden aplicar revisiones antes de aprobar o denegar los medios. Se aplican límites independientes por número de peticiones y por número total de elementos procesados.","operationId":"upsertProviderMediaBulk","security":[{"UserApiKey":[]}],"x-public-rate-limits":["ip","credential","failed_authentication","bulk_execute_requests","bulk_execute_items","bulk_global_requests","bulk_global_items"],"x-required-scopes":["provider.media:write"],"x-public-excluded-parameters":["Idempotency-Key"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMediaRequest"},"example":{"items":[{"reference":"MEDIA-001","base_product":{"name":"Diario Salud","price":50,"url":"https://bulk-salud.example.com","category":"newspaper","languages":["es"],"regions":["64"],"topics":["24"],"submission_email":"salud@example.com","publication_example":"https://bulk-salud.example.com/noticia"},"additional_products":{"link-insertion":{"price":40,"active":true},"mention":{"price":30,"active":true}}},{"reference":"MEDIA-002","base_product":{"name":"Blog Tecnología","price":35,"url":"https://bulk-tecnologia.example.com","category":"blog","languages":["en"],"regions":["64"],"topics":["25"],"submission_email":"tech@example.com","publication_example":"https://bulk-tecnologia.example.com/article"},"additional_products":{"mention":{"price":25,"active":false}}},{"reference":"MEDIA-003","base_product":{"name":"Revista Viajes","price":70,"url":"https://bulk-viajes.example.com","category":"newspaper","languages":["es"],"regions":["64"],"topics":["26"],"submission_email":"viajes@example.com","publication_example":"https://bulk-viajes.example.com/reportaje"},"additional_products":{"mention-insertion":{"price":20,"active":true}}}]}}}},"x-codeSamples":[{"lang":"curl","source":"curl --request POST \\\n  --url 'https://shop.prensalink.com/api-external/v1/provider/media/bulk' \\\n  --header 'Authorization: Bearer plk_live_provider_xxxxxxxxx' \\\n  --header 'Content-Type: application/json' \\\n  --data @lote.json"}],"responses":{"200":{"description":"Resultado del lote. Puede contener éxitos y errores por elemento.","headers":{"Idempotency-Replayed":{"$ref":"#/components/headers/IdempotencyReplayed"},"X-Bulk-RateLimit-Requests-Limit":{"$ref":"#/components/headers/BulkRequestsLimit"},"X-Bulk-RateLimit-Requests-Remaining":{"$ref":"#/components/headers/BulkRequestsRemaining"},"X-Bulk-RateLimit-Items-Limit":{"$ref":"#/components/headers/BulkItemsLimit"},"X-Bulk-RateLimit-Items-Remaining":{"$ref":"#/components/headers/BulkItemsRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMediaResponse"},"example":{"data":{"mode":"execution","batch_id":"c759bedf532759db5d4f35bf15b7824b","summary":{"total":2,"created":1,"updated":0,"unchanged":0,"errors":1},"items":[{"index":0,"reference":"MEDIA-001","url":"https://bulk-ejemplo.com","status":"success","action":"created","request_references":["1024"]},{"index":1,"reference":"MEDIA-002","url":"https://existente.com","status":"error","action":null,"error":{"code":"media_already_exists","message":"Este medio ya existe en Prensalink.","messages":[],"http_status":409}}]}}}}},"400":{"$ref":"#/components/responses/InvalidIdempotencyKey"},"401":{"$ref":"#/components/responses/InvalidProviderCredentials"},"403":{"$ref":"#/components/responses/ProviderForbidden"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/InvalidRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}}},"components":{"securitySchemes":{"UserApiKey":{"type":"http","scheme":"bearer","bearerFormat":"Prensalink API key","description":"API key generada por el usuario en su cuenta de Prensalink."}},"parameters":{"Page":{"name":"page","in":"query","required":false,"description":"Página solicitada, comenzando en 1.","schema":{"type":"integer","minimum":1,"default":1}},"Language":{"name":"language","in":"query","required":false,"description":"Idioma de los nombres devueltos.","schema":{"type":"string","enum":["es","en","fr","it","pt"],"default":"es"}},"Country":{"name":"country","in":"query","required":true,"description":"Código ISO 3166-1 alpha-2.","schema":{"type":"string","minLength":2,"maxLength":2,"example":"ES"}},"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"description":"Identificador único de una operación idempotente. Debe contener únicamente caracteres ASCII visibles, sin espacios, y reutilizarse solamente al reintentar exactamente la misma petición durante las siguientes 24 horas.","schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[\\x21-\\x7E]+$","example":"lq-operation-12345"}}},"headers":{"IdempotencyReplayed":{"description":"Indica si se ha recuperado la respuesta de una ejecución anterior.","schema":{"type":"boolean"}},"BulkRequestsLimit":{"description":"Número máximo de peticiones bulk permitido en la ventana actual para esta credencial y operación.","schema":{"type":"integer"}},"BulkRequestsRemaining":{"description":"Peticiones bulk restantes en la ventana actual para esta credencial y operación.","schema":{"type":"integer"}},"BulkItemsLimit":{"description":"Número máximo de elementos bulk permitido en la ventana actual para esta credencial y operación.","schema":{"type":"integer"}},"BulkItemsRemaining":{"description":"Elementos bulk restantes en la ventana actual para esta credencial y operación.","schema":{"type":"integer"}}},"responses":{"InvalidUserApiKey":{"description":"API key de usuario ausente o inválida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_api_key","message":"A valid API key must be provided as a Bearer token."}}}}},"InvalidCatalogCredential":{"description":"No se ha proporcionado una API key de usuario válida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"InvalidProviderCredentials":{"description":"Las credenciales presentadas no son válidas para esta operación.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"InsufficientScope":{"description":"La API key de usuario no tiene el scope requerido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"insufficient_scope","message":"The API key does not have the required scope."}}}}},"InvalidRequest":{"description":"La petición no cumple las reglas de validación.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_request","message":"The supplied data is invalid."}}}}},"InvalidIdempotencyKey":{"description":"Idempotency-Key no tiene un formato válido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Conflict":{"description":"El recurso ya existe o la Idempotency-Key se reutilizó con otro contenido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"MediaNotFound":{"description":"El medio o tipo de producto no está asignado al proveedor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"RateLimited":{"description":"Límite de peticiones o de elementos procesados superado.","headers":{"Retry-After":{"description":"Segundos hasta poder reintentar.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Límite general aplicado cuando corresponde.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Identifica el presupuesto que ha provocado el bloqueo.","schema":{"type":"string"}},"X-Bulk-RateLimit-Limit":{"description":"Límite bulk que ha bloqueado la petición.","schema":{"type":"integer"}},"X-Bulk-RateLimit-Remaining":{"description":"Capacidad restante en el límite bulk que ha bloqueado la petición.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"general":{"value":{"error":{"code":"rate_limit_exceeded","message":"Too many requests. Please try again later."}}},"bulk":{"value":{"error":{"code":"bulk_rate_limit_exceeded","message":"Se ha superado el límite de procesamiento bulk. Inténtalo de nuevo más tarde."}}}}}}},"ProviderForbidden":{"description":"La cuenta autenticada no puede gestionar este medio o proveedor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"schemas":{"CustomerArticleUploadResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["image_reference","url","mime_type","size","width","height"],"properties":{"image_reference":{"type":"string","pattern":"^img_[a-f0-9]{32}$","description":"Referencia de la imagen. Usa url para insertarla en el HTML."},"url":{"type":"string","format":"uri","description":"URL pública sin caducidad. Las imágenes nunca utilizadas se limpian tras 48 horas."},"mime_type":{"type":"string","enum":["image/jpeg","image/png"]},"size":{"type":"integer","minimum":1,"maximum":3145728,"description":"Tamaño final en bytes."},"width":{"type":"integer","minimum":1,"maximum":2048},"height":{"type":"integer","minimum":1,"maximum":2048}}}}},"ErrorResponse":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}},"Pagination":{"type":"object","required":["page","page_size","total","last_page","has_more","next_page"],"properties":{"page":{"type":"integer"},"page_size":{"type":"integer"},"total":{"type":"integer"},"last_page":{"type":"integer"},"has_more":{"type":"boolean"},"next_page":{"type":"integer","nullable":true}}},"IdentityResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"user":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"country":{"type":"string","nullable":true},"roles":{"type":"array","items":{"type":"string"}},"is_admin":{"type":"boolean","description":"Indica si el usuario tiene actualmente el rol de administrador."}}},"credential":{"type":"object","properties":{"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"expires_at":{"type":"string","format":"date-time","nullable":true}}}}}}},"CustomerBillingProfile":{"type":"object","required":["id","type","fiscal_id","name","second_name","address","zip_code","locality","country_code"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["individual","freelancer","company"]},"fiscal_id":{"type":"string"},"vat_id":{"type":"string","nullable":true},"name":{"type":"string"},"second_name":{"type":"string"},"address":{"type":"string"},"zip_code":{"type":"string"},"locality":{"type":"string"},"region":{"type":"string","nullable":true,"description":"Nombre de la región española guardada en el perfil."},"country":{"type":"string"},"country_code":{"type":"string","minLength":2,"maxLength":2},"phone":{"type":"string","nullable":true}}},"CustomerBillingProfileCreateRequest":{"type":"object","additionalProperties":false,"required":["type","name","second_name","fiscal_id","address","zip_code","locality","country_code"],"properties":{"type":{"type":"string","enum":["individual","freelancer","company"]},"name":{"type":"string","minLength":3,"maxLength":255},"second_name":{"type":"string","minLength":3,"maxLength":255},"fiscal_id":{"type":"string","minLength":5,"maxLength":100},"vat_id":{"type":"string","nullable":true,"minLength":4,"maxLength":20,"description":"No admitido cuando type es individual."},"address":{"type":"string","maxLength":255},"zip_code":{"type":"string","maxLength":255},"locality":{"type":"string","maxLength":255},"country_code":{"type":"string","minLength":2,"maxLength":2,"description":"Código ISO de /catalog/countries; WW no se admite."},"region":{"type":"string","nullable":true,"description":"Obligatoria para ES. Acepta id o nombre de /catalog/regions?country=ES."},"phone":{"type":"string","nullable":true,"maxLength":14}}},"CustomerBillingProfileUpdateRequest":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"type":{"type":"string","enum":["individual","freelancer","company"]},"name":{"type":"string","minLength":3,"maxLength":255},"second_name":{"type":"string","minLength":3,"maxLength":255},"fiscal_id":{"type":"string","minLength":5,"maxLength":100},"vat_id":{"type":"string","nullable":true,"minLength":4,"maxLength":20},"address":{"type":"string","maxLength":255},"zip_code":{"type":"string","maxLength":255},"locality":{"type":"string","maxLength":255},"country_code":{"type":"string","minLength":2,"maxLength":2},"region":{"type":"string","nullable":true,"description":"Para ES acepta id o nombre de /catalog/regions?country=ES."},"phone":{"type":"string","nullable":true,"maxLength":14}}},"CustomerBillingProfileResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/CustomerBillingProfile"}}},"CustomerCheckoutContextResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["billing_profiles","default_billing_profile_id","balance","payment_methods"],"properties":{"billing_profiles":{"type":"array","items":{"$ref":"#/components/schemas/CustomerBillingProfile"}},"default_billing_profile_id":{"type":"string","nullable":true},"balance":{"type":"object","required":["amount","currency"],"properties":{"amount":{"type":"number","description":"Saldo total de la cuenta, como el saldo que se muestra en el panel de cliente."},"currency":{"type":"string","enum":["EUR"]}}},"payment_methods":{"type":"array","items":{"type":"string","enum":["account_funds","bank_transfer"]}}}}}},"CustomerCheckoutQuoteRequest":{"type":"object","additionalProperties":false,"required":["billing_profile_id","payment_method"],"properties":{"billing_profile_id":{"type":"string","description":"ID de un perfil propio devuelto por GET /customer/checkout/context."},"payment_method":{"type":"string","enum":["account_funds","bank_transfer"]},"coupons":{"type":"array","description":"Códigos opcionales; quedan vinculados al presupuesto. No se guardan en el carrito ni se vuelven a enviar al confirmar.","maxItems":20,"uniqueItems":true,"items":{"type":"string","minLength":1,"maxLength":100}},"comment":{"type":"string","nullable":true,"maxLength":2000,"description":"Comentario opcional del pedido, vinculado a este presupuesto."}}},"CustomerCheckoutQuoteResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["quote_id","expires_at","items","billing_profile_id","payment_method","payment_fees","vat_rate","vat_amount","total_without_taxes","total","currency"],"properties":{"quote_id":{"type":"string","pattern":"^quote_[a-f0-9]{64}$","description":"Presupuesto propio que debe enviarse al confirmar."},"expires_at":{"type":"string","description":"Caducidad en UTC, formato DD-MM-YYYY HH:mm:ss. Duración predeterminada: 15 minutos."},"items":{"type":"array","items":{"type":"object","required":["type","name","quantity","unit_price","subtotal"],"properties":{"type":{"type":"string","enum":["product","addon","attribute","coupon"]},"name":{"type":"string"},"quantity":{"type":"integer","minimum":1},"unit_price":{"type":"number","description":"Precio unitario con impuestos."},"subtotal":{"type":"number","description":"Importe de la línea con impuestos."}}}},"billing_profile_id":{"type":"string"},"payment_method":{"type":"string","enum":["account_funds","bank_transfer"]},"payment_fees":{"type":"number","description":"Gastos de pago con impuestos."},"vat_rate":{"type":"number"},"vat_amount":{"type":"number"},"total_without_taxes":{"type":"number"},"total":{"type":"number"},"currency":{"type":"string","enum":["EUR"]},"sufficient_balance":{"type":"boolean","description":"Solo se incluye para account_funds. Indica si el saldo disponible cubre el total al cotizar; no reserva fondos."}}}}},"CustomerOrderPlacementRequest":{"type":"object","additionalProperties":false,"required":["quote_id"],"properties":{"quote_id":{"type":"string","pattern":"^quote_[a-f0-9]{64}$","description":"quote_id propio devuelto por POST /customer/checkout/quote."}}},"CustomerOrderPlacementResponse":{"oneOf":[{"$ref":"#/components/schemas/CustomerBankTransferOrderResponse"},{"$ref":"#/components/schemas/CustomerAccountFundsOrderResponse"}]},"CustomerAccountFundsOrderResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["order_number","status","payment_method","total","currency","payment"],"properties":{"order_number":{"type":"string"},"status":{"type":"string","enum":["pending","in_progress","completed","cancelled"],"description":"Estado actual del pedido; puede tardar en actualizarse tras el cobro."},"payment_method":{"type":"string","enum":["account_funds"]},"total":{"type":"number"},"currency":{"type":"string","enum":["EUR"]},"payment":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["completed"],"description":"El cargo al saldo se ha completado antes de enviar esta respuesta."}}}}}}},"CustomerBankTransferOrderResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["order_number","status","payment_method","total","currency","bank_transfer"],"properties":{"order_number":{"type":"string"},"status":{"type":"string","enum":["pending","in_progress","completed","cancelled"]},"payment_method":{"type":"string","enum":["bank_transfer"]},"total":{"type":"number"},"currency":{"type":"string","enum":["EUR"]},"bank_transfer":{"type":"object","required":["account_holder","bank_name","iban","amount","currency","reference"],"properties":{"account_holder":{"type":"string"},"bank_name":{"type":"string"},"iban":{"type":"string"},"amount":{"type":"number"},"currency":{"type":"string","enum":["EUR"]},"reference":{"type":"string","description":"Usar el número de pedido como concepto de la transferencia."}}}}}}},"CustomerOrderSummary":{"type":"object","required":["order_number","status","payment_method","items_count","total","currency","created_at"],"properties":{"order_number":{"type":"string","description":"Número público del pedido; no es un ID interno."},"status":{"type":"string","enum":["pending","in_progress","completed","cancelled"]},"payment_method":{"type":"string","description":"Puede incluir métodos usados por pedidos históricos de la web."},"items_count":{"type":"integer","description":"Número de unidades de producto del pedido."},"total":{"type":"number","description":"Total del pedido con impuestos."},"currency":{"type":"string","enum":["EUR"]},"created_at":{"type":"string","description":"Fecha DD-MM-YYYY HH:mm:ss."}}},"CustomerOrderPageResponse":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CustomerOrderSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"CustomerInvoice":{"type":"object","required":["invoice_number","invoice_date","description","order_number","total","currency","pdf_available","download_url"],"properties":{"invoice_number":{"type":"string","description":"Número público de la factura; no es un ID interno."},"invoice_date":{"type":"string","nullable":true,"description":"Fecha de emisión DD-MM-YYYY; puede ser null en facturas históricas."},"description":{"type":"string"},"order_number":{"type":"string","nullable":true,"description":"Número del pedido asociado cuando la factura corresponde a uno; null para recargas u otras facturas."},"total":{"type":"number","description":"Importe de la factura con impuestos."},"currency":{"type":"string","enum":["EUR"]},"pdf_available":{"type":"boolean"},"download_url":{"type":"string","nullable":true,"description":"Ruta relativa de descarga; requiere la misma API key. Null si aún no existe el PDF."}}},"CustomerInvoicePageResponse":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CustomerInvoice"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"CustomerOrderExtra":{"type":"object","required":["name","price","is_cancelled"],"properties":{"name":{"type":"string"},"price":{"type":"number"},"is_cancelled":{"type":"boolean"}}},"CustomerArticleImage":{"type":"object","required":["available","url","expires_at","message"],"properties":{"available":{"type":"boolean"},"url":{"type":"string","format":"uri","nullable":true,"description":"URL absoluta de descarga; null si no está disponible. Las URLs firmadas no deben modificarse ni compartirse públicamente."},"expires_at":{"type":"string","nullable":true,"description":"DD-MM-YYYY HH:mm:ss. Caducidad de una URL firmada; null para imágenes públicas o no disponibles."},"message":{"type":"string","nullable":true,"description":"Imagen no disponible. cuando available=false; null en caso contrario."}}},"CustomerOrderArticle":{"type":"object","nullable":true,"required":["title","content","content_format","status","review_status","can_review","instructions","images"],"properties":{"title":{"type":"string","description":"El título se devuelve por separado y no se incluye en content."},"content":{"type":"string","nullable":true,"description":"HTML saneado del artículo, o null si aún no tiene contenido. Solo lectura en esta API. Las imágenes PNG, JPEG y WebP de Prensalink se conservan en su posición en article.content y se detallan en article.images."},"content_format":{"type":"string","nullable":true,"enum":["html"]},"status":{"type":"string","enum":["pending","in_progress","completed","cancelled"]},"review_status":{"type":"string","enum":["not_ready","awaiting_approval","changes_requested","approved"]},"can_review":{"type":"boolean","description":"Solo true cuando este artículo entregado admite una decisión del cliente."},"instructions":{"type":"string","nullable":true},"images":{"type":"array","items":{"$ref":"#/components/schemas/CustomerArticleImage"},"description":"Imágenes en el mismo orden en que aparecen en el artículo."}}},"ReviewCustomerOrderArticleRequest":{"type":"object","additionalProperties":false,"required":["action"],"properties":{"action":{"type":"string","enum":["approve","request_changes"]},"comment":{"type":"string","minLength":3,"maxLength":5000,"description":"Obligatorio solo para request_changes. Se guarda como texto sin HTML."}}},"ReviewCustomerOrderArticleResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["order_number","item_reference","review_status","can_review"],"properties":{"order_number":{"type":"string"},"item_reference":{"type":"string","pattern":"^itm_[a-f0-9]{32}$"},"review_status":{"type":"string","enum":["approved","changes_requested"]},"can_review":{"type":"boolean","enum":[false]}}}}},"CustomerOrderConfiguration":{"type":"object","nullable":true,"required":["content_writer","instructions","links","publication_date","existing_article_url","brand_instructions"],"properties":{"content_writer":{"type":"string","enum":["customer","prensalink","media"]},"instructions":{"type":"string","nullable":true},"links":{"type":"array","items":{"$ref":"#/components/schemas/CustomerCartConfigurationLink"}},"publication_date":{"type":"string","nullable":true,"description":"Fecha DD-MM-YYYY."},"existing_article_url":{"type":"string","nullable":true,"format":"uri"},"brand_instructions":{"type":"string","nullable":true}}},"ConfigureCustomerOrderItemRequest":{"type":"object","additionalProperties":false,"required":["configuration"],"properties":{"configuration":{"type":"object","additionalProperties":false,"minProperties":1,"description":"Completa la configuración inicial de una unidad pendiente. Se admiten los mismos campos aplicables al tipo de producto que en el carrito, salvo configure_later, addons y conflict_topics. Cuando content_writer es customer, los enlaces van dentro de article.content y no en links.","properties":{"content_writer":{"type":"string","nullable":true,"enum":["prensalink","customer","media"],"description":"Solo article-with-link y mention."},"links":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/CustomerCartConfigurationLink"},"description":"Solo article-with-link y link-insertion; no se envía cuando content_writer es customer."},"instructions":{"type":"string","nullable":true,"maxLength":65535},"publication_date":{"type":"string","nullable":true,"pattern":"^[0-9]{2}-[0-9]{2}-[0-9]{4}$","description":"DD-MM-YYYY; solo article-with-link y mention."},"article":{"type":"object","nullable":true,"additionalProperties":false,"minProperties":1,"description":"Solo article-with-link y mention. HTML saneado antes de guardarse.","properties":{"title":{"type":"string","nullable":true,"maxLength":255},"content":{"type":"string","nullable":true,"maxLength":2000000,"description":"Imágenes mediante <img> con URLs devueltas por POST /customer/article-images para esta cuenta; máximo 5. Enlaces en etiquetas <a>."}}},"existing_article_url":{"type":"string","nullable":true,"maxLength":2048,"description":"Solo link-insertion y mention-insertion; debe pertenecer al mismo medio."},"brand_instructions":{"type":"string","nullable":true,"maxLength":100,"description":"Solo mention y mention-insertion."}}}}},"ConfigureCustomerOrderItemResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["order_number","item_reference","configuration_status","can_configure"],"properties":{"order_number":{"type":"string"},"item_reference":{"type":"string","pattern":"^itm_[a-f0-9]{32}$"},"configuration_status":{"type":"string","enum":["configured"]},"can_configure":{"type":"boolean","enum":[false]}}}}},"CustomerOrderItem":{"type":"object","required":["item_reference","unit","name","media_url","product_type","category","is_cancelled","price","configuration_status","can_configure","configuration","article","publication_urls","addons","attributes"],"properties":{"item_reference":{"type":"string","pattern":"^itm_[a-f0-9]{32}$","description":"Referencia pública y estable de esta unidad dentro del pedido. No es un identificador interno ni autoriza el acceso por sí sola."},"unit":{"type":"integer","minimum":1},"name":{"type":"string"},"media_url":{"type":"string","format":"uri","nullable":true,"description":"Puede ser null si el producto original ya no está disponible."},"product_type":{"type":"string","nullable":true,"enum":["article-with-link","link-insertion","mention","mention-insertion"],"description":"Puede ser null para categorías históricas ajenas al catálogo actual."},"category":{"type":"string","nullable":true,"enum":["newspaper","blog"]},"is_cancelled":{"type":"boolean"},"price":{"type":"number","description":"Precio de esta unidad con impuestos."},"configuration_status":{"type":"string","enum":["pending","configured"],"description":"pending si esta unidad no tiene configuración; configured si ya la tiene."},"can_configure":{"type":"boolean","description":"Indica si esta unidad admite configuración inicial con PATCH /customer/orders/{orderNumber}/items/{itemReference}/configuration. Los packs de varios medios se configuran desde el panel."},"configuration":{"$ref":"#/components/schemas/CustomerOrderConfiguration"},"article":{"$ref":"#/components/schemas/CustomerOrderArticle"},"publication_urls":{"type":"array","items":{"type":"string","format":"uri"}},"addons":{"type":"array","items":{"$ref":"#/components/schemas/CustomerOrderExtra"}},"attributes":{"type":"array","items":{"$ref":"#/components/schemas/CustomerOrderExtra"}}}},"CustomerOrderDetail":{"type":"object","required":["order_number","status","payment_method","items_count","total","currency","created_at","total_without_taxes","vat_rate","vat_amount","payment_fees","coupons","items"],"properties":{"order_number":{"type":"string"},"status":{"type":"string","enum":["pending","in_progress","completed","cancelled"]},"payment_method":{"type":"string"},"items_count":{"type":"integer"},"total":{"type":"number"},"currency":{"type":"string","enum":["EUR"]},"created_at":{"type":"string","description":"DD-MM-YYYY HH:mm:ss."},"total_without_taxes":{"type":"number"},"vat_rate":{"type":"number"},"vat_amount":{"type":"number"},"payment_fees":{"type":"number"},"coupons":{"type":"array","description":"Cupones aplicados; amount_discount es positivo y contiene impuestos.","items":{"type":"object","required":["code","amount_discount"],"properties":{"code":{"type":"string"},"amount_discount":{"type":"number"}}}},"items":{"type":"array","items":{"$ref":"#/components/schemas/CustomerOrderItem"}}}},"CustomerOrderDetailResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/CustomerOrderDetail"}}},"ProductCatalogItem":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"publication_example":{"type":"string","format":"uri","nullable":true,"description":"URL de una publicación de ejemplo del medio."},"updated_at":{"type":"string"},"base_price":{"type":"number","description":"Precio base del producto, sin promociones ni descuentos personalizados. No incluye impuestos."},"has_promo":{"type":"boolean","description":"Indica si existe una promoción activa aplicable al usuario autenticado. No indica si el usuario tiene un descuento individual."},"promo_price":{"type":"number","description":"Precio configurado por la promoción activa. Si has_promo es false, coincide con base_price. No incluye descuentos individuales del cliente ni impuestos."},"price":{"type":"number","description":"Precio final personalizado para el usuario autenticado, sin impuestos. Puede incluir descuentos del cliente, descuentos premium y promociones."},"category":{"type":"string","enum":["newspaper","blog"],"description":"Categoría del medio."},"product_type":{"type":"string","enum":["article-with-link","link-insertion","mention","mention-insertion"]},"do_follow":{"type":"boolean"},"sponsored":{"type":"boolean"},"rel_sponsored":{"type":"boolean"},"in_home":{"type":"boolean"},"social_shared":{"type":"boolean"},"country":{"type":"string"},"language":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"num_links":{"type":"integer"},"dr":{"type":"number"},"da":{"type":"number"},"tf":{"type":"number"},"cf":{"type":"number"},"traffic":{"type":"integer"},"keywords":{"type":"integer"},"conflict_topics":{"type":"object","additionalProperties":{"type":"number"}},"estimated_publication_time":{"type":"integer","nullable":true,"description":"Tiempo estimado de publicación expresado en días. Es un número entero; por ejemplo, 3 significa aproximadamente 3 días. Puede ser null si no hay una estimación disponible."}}},"ProductPageResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProductCatalogItem"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"ProductDetailResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProductCatalogItem"}}}},"AddCustomerCartItemRequest":{"type":"object","additionalProperties":false,"required":["url","product_type","quantity"],"properties":{"url":{"type":"string","format":"uri","maxLength":255,"description":"URL del medio. Se recomienda HTTPS sin barra final; para productos antiguos también se aceptan http o barra final si coinciden con un producto publicado existente."},"product_type":{"type":"string","enum":["article-with-link","link-insertion","mention","mention-insertion"]},"quantity":{"type":"integer","minimum":1,"maximum":500,"description":"Número de unidades que se suman al carrito en esta llamada. La cantidad total por producto no puede superar 500."}}},"SetCustomerCartItemRequest":{"type":"object","additionalProperties":false,"required":["url","product_type","quantity"],"properties":{"url":{"type":"string","format":"uri","maxLength":255,"description":"URL del medio ya existente en el carrito. Se recomienda HTTPS sin barra final; para productos antiguos también se aceptan http o barra final si coinciden con un producto publicado existente."},"product_type":{"type":"string","enum":["article-with-link","link-insertion","mention","mention-insertion"]},"quantity":{"type":"integer","minimum":0,"maximum":500,"description":"Cantidad final que tendrá el producto existente. El valor 0 lo elimina del carrito."}}},"CustomerCartItem":{"type":"object","required":["url","category","product_type","name","quantity","unit_price","subtotal","currency"],"properties":{"url":{"type":"string","format":"uri"},"category":{"type":"string","enum":["newspaper","blog"]},"product_type":{"type":"string","enum":["article-with-link","link-insertion","mention","mention-insertion"]},"name":{"type":"string"},"quantity":{"type":"integer","description":"Cantidad total del producto en el carrito después de esta llamada."},"unit_price":{"type":"number","description":"Precio unitario personalizado del cliente, sin impuestos."},"subtotal":{"type":"number","description":"Precio unitario multiplicado por la cantidad total, sin impuestos."},"currency":{"type":"string","enum":["EUR"]}}},"AddCustomerCartItemResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["action","added_quantity","item"],"properties":{"action":{"type":"string","enum":["added"]},"added_quantity":{"type":"integer","description":"Unidades sumadas por esta llamada."},"item":{"$ref":"#/components/schemas/CustomerCartItem"}}}}},"CustomerCartResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["items","summary"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CustomerCartItem"}},"summary":{"type":"object","required":["item_count","total_quantity","subtotal","currency"],"properties":{"item_count":{"type":"integer","description":"Número de productos diferentes en el carrito."},"total_quantity":{"type":"integer","description":"Suma de todas las unidades del carrito."},"subtotal":{"type":"number","description":"Suma de los subtotales personalizados, sin impuestos."},"currency":{"type":"string","enum":["EUR"]}}}}}}},"SetCustomerCartItemResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["action","previous_quantity"],"properties":{"action":{"type":"string","enum":["updated","removed"]},"previous_quantity":{"type":"integer"},"current_quantity":{"type":"integer","description":"Se devuelve con valor 0 cuando el producto se elimina."},"url":{"type":"string","format":"uri","description":"Se devuelve cuando el producto se elimina."},"product_type":{"type":"string","enum":["article-with-link","link-insertion","mention","mention-insertion"],"description":"Se devuelve cuando el producto se elimina."},"item":{"$ref":"#/components/schemas/CustomerCartItem"}}}}},"ClearCustomerCartResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["action","removed_item_count","removed_quantity"],"properties":{"action":{"type":"string","enum":["cleared"]},"removed_item_count":{"type":"integer","description":"Número de productos diferentes eliminados."},"removed_quantity":{"type":"integer","description":"Suma de unidades eliminadas."}}}}},"CustomerCartConfigurationLink":{"type":"object","additionalProperties":false,"required":["anchor_text","url"],"properties":{"anchor_text":{"type":"string","nullable":true,"maxLength":255},"url":{"type":"string","nullable":true,"maxLength":2048,"description":"Destino HTTP o HTTPS."}}},"UpdateCustomerCartItemConfigurationRequest":{"type":"object","additionalProperties":false,"required":["url","product_type","unit","configuration"],"properties":{"url":{"type":"string","format":"uri","maxLength":255,"description":"URL del medio ya existente en el carrito; admite URLs históricas de productos publicados."},"product_type":{"type":"string","enum":["article-with-link","link-insertion","mention","mention-insertion"]},"unit":{"type":"integer","minimum":1,"maximum":500,"description":"Número de unidad existente en el carrito, comenzando por 1."},"configuration":{"type":"object","additionalProperties":false,"minProperties":1,"description":"Actualización parcial. article-with-link admite content_writer, links, publication_date, article, addons y conflict_topics; link-insertion admite links y existing_article_url, pero no addons ni conflict_topics; mention admite content_writer, publication_date, article, brand_instructions, addons y conflict_topics; mention-insertion admite existing_article_url, brand_instructions, addons y conflict_topics. Todos admiten instructions y configure_later.","properties":{"content_writer":{"type":"string","nullable":true,"enum":["prensalink","customer","media"],"description":"Solo article-with-link y mention. Si es customer, envía los enlaces dentro de article.content en HTML; configuration.links está prohibido."},"links":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/CustomerCartConfigurationLink"},"description":"Solo article-with-link o link-insertion. Para article-with-link, úsalo únicamente cuando content_writer no sea customer. link-insertion admite un enlace y no admite conflict_topics ni addons."},"instructions":{"type":"string","nullable":true,"maxLength":65535},"publication_date":{"type":"string","nullable":true,"pattern":"^[0-9]{2}-[0-9]{2}-[0-9]{4}$","description":"Fecha DD-MM-YYYY. Solo article-with-link y mention."},"article":{"type":"object","nullable":true,"additionalProperties":false,"minProperties":1,"description":"Solo article-with-link y mention. El contenido HTML se sanitiza; cuando content_writer es customer, incluye aquí los enlaces como etiquetas <a>.","properties":{"title":{"type":"string","nullable":true,"maxLength":255},"content":{"type":"string","nullable":true,"maxLength":2000000,"description":"HTML del artículo. Incluye imágenes con <img> y las URLs devueltas por POST /customer/article-images para esta misma cuenta (máximo 5); no se admiten URLs externas ni data: ni file:."}}},"existing_article_url":{"type":"string","nullable":true,"maxLength":2048,"description":"Solo link-insertion y mention-insertion; debe pertenecer al mismo medio."},"brand_instructions":{"type":"string","nullable":true,"maxLength":100,"description":"Solo mention y mention-insertion."},"addons":{"type":"array","nullable":true,"uniqueItems":true,"items":{"type":"string"},"description":"IDs de opciones disponibles; no se admite para link-insertion."},"conflict_topics":{"type":"array","nullable":true,"uniqueItems":true,"items":{"type":"string"},"description":"Slugs de temáticas disponibles; no se admite para link-insertion."},"configure_later":{"type":"boolean","description":"Opcional. Omítelo al configurar normalmente; en una unidad nueva vale false. Envía true para posponer la configuración o false únicamente para quitar una posposición previa. Si se omite, conserva su valor aunque se modifiquen otros campos."}}}}},"CustomerCartItemConfigurationResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["item","configuration","requirements","available_options","pricing"],"properties":{"item":{"type":"object","required":["url","category","product_type","name","quantity"],"properties":{"url":{"type":"string","format":"uri"},"category":{"type":"string","enum":["newspaper","blog"]},"product_type":{"type":"string","enum":["article-with-link","link-insertion","mention","mention-insertion"]},"name":{"type":"string"},"quantity":{"type":"integer"}}},"configuration":{"type":"object","required":["status","configured_units","total_units","ready_for_order","updated_at","units"],"properties":{"status":{"type":"string","enum":["empty","partial","complete"]},"configured_units":{"type":"integer"},"total_units":{"type":"integer"},"ready_for_order":{"type":"boolean"},"updated_at":{"type":"string","nullable":true,"description":"DD-MM-YYYY HH:mm:ss, o null si nunca se configuró."},"units":{"type":"array","items":{"$ref":"#/components/schemas/CustomerCartConfiguredUnit"}}}},"requirements":{"type":"object","description":"Capacidades y requisitos específicos del tipo de producto; consulta esta sección antes de enviar PATCH.","properties":{"links":{"type":"object","properties":{"minimum":{"type":"integer"},"maximum":{"type":"integer"}}},"content_writer":{"type":"object","properties":{"supported":{"type":"boolean"}}},"article":{"type":"object","properties":{"supported":{"type":"boolean"},"format":{"type":"string","enum":["html"]}}},"existing_article_url":{"type":"object","properties":{"supported":{"type":"boolean"},"required":{"type":"boolean"},"same_media_domain":{"type":"boolean"}}},"brand_instructions":{"type":"object","properties":{"supported":{"type":"boolean"},"maximum_length":{"type":"integer"}}},"publication_date":{"type":"object","properties":{"supported":{"type":"boolean"},"required":{"type":"boolean"}}},"configure_later":{"type":"boolean"}}},"available_options":{"type":"object","properties":{"content_writers":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"name":{"type":"string"},"additional_price":{"type":"number"},"currency":{"type":"string"}}}},"conflict_topics":{"type":"array","description":"Siempre vacío para link-insertion.","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"},"currency":{"type":"string"}}}},"addons":{"type":"array","description":"Siempre vacío para link-insertion.","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"title":{"type":"string"},"subtitle":{"type":"string"},"description":{"type":"string"},"price":{"type":"number"},"required_urls":{"type":"integer"},"currency":{"type":"string"}}}}}},"pricing":{"type":"object","required":["unit_price","base_subtotal","selected_extras_subtotal","total","currency"],"properties":{"unit_price":{"type":"number"},"base_subtotal":{"type":"number"},"selected_extras_subtotal":{"type":"number"},"total":{"type":"number"},"currency":{"type":"string","enum":["EUR"]}}}}}}},"CustomerCartConfiguredUnit":{"type":"object","required":["unit","status","configure_later","content_writer","links","instructions","publication_date","article","validation_errors"],"properties":{"unit":{"type":"integer","minimum":1},"status":{"type":"string","enum":["empty","partial","complete"]},"configure_later":{"type":"boolean"},"content_writer":{"type":"string","nullable":true,"enum":["prensalink","customer","media"]},"links":{"type":"array","items":{"$ref":"#/components/schemas/CustomerCartConfigurationLink"},"description":"Si content_writer es customer, se extraen de article.content."},"instructions":{"type":"string","nullable":true},"publication_date":{"type":"string","nullable":true,"description":"DD-MM-YYYY."},"article":{"type":"object","nullable":true,"properties":{"title":{"type":"string","nullable":true},"content":{"type":"string","nullable":true,"description":"HTML sanitizado del artículo. Las imágenes PNG, JPEG y WebP de Prensalink se conservan en su posición en article.content y se detallan en article.images."},"images":{"type":"array","items":{"$ref":"#/components/schemas/CustomerArticleImage"}}},"required":["title","content","images"]},"existing_article_url":{"type":"string","nullable":true,"description":"Solo en link-insertion y mention-insertion."},"brand_instructions":{"type":"string","nullable":true,"description":"Solo en mention y mention-insertion."},"addons":{"type":"array","items":{"type":"string"},"description":"Omitido en link-insertion."},"conflict_topics":{"type":"array","items":{"type":"string"},"description":"Omitido en link-insertion."},"validation_errors":{"type":"array","items":{"type":"string"}}}},"CountriesResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"}}}}}},"RegionsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"country":{"type":"string"}}}}}},"TopicsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}}}}},"ConflictTopicsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"minimum_price":{"type":"number"}}}}}},"ProductTypesResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"product_type":{"type":"string","enum":["article-with-link","link-insertion","mention","mention-insertion"]},"name":{"type":"string"},"minimum_price":{"type":"number"}}}}}},"CreateProviderRequest":{"type":"object","additionalProperties":false,"required":["name","email","country"],"properties":{"name":{"type":"string","minLength":2,"maxLength":255},"email":{"type":"string","format":"email","maxLength":255},"country":{"type":"string","minLength":2,"maxLength":2},"locale":{"type":"string","nullable":true,"maxLength":32,"description":"Idioma del correo de bienvenida y de la cuenta. Se admiten es, en, fr, it y pt. Si se omite o se indica otro valor, se usa en."}}},"CreateProviderResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"provider":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"country":{"type":"string"},"roles":{"type":"array","items":{"type":"string"}},"active":{"type":"boolean"},"approved":{"type":"boolean"}}},"credential":{"type":"object","properties":{"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"expires_at":{"type":"string","format":"date-time","nullable":true},"api_key":{"type":"string","readOnly":true,"description":"Se muestra solamente al crear el proveedor y al recuperar esa misma respuesta mediante idempotencia."}}}}}}},"ConflictTopicConfiguration":{"type":"object","required":["price"],"properties":{"price":{"type":"number","minimum":0,"maximum":75000}}},"AdditionalProductConfiguration":{"type":"object","required":["price"],"properties":{"price":{"type":"number","minimum":10,"maximum":75000},"active":{"type":"boolean","default":true}}},"AdditionalProductBulkConfiguration":{"type":"object","properties":{"price":{"type":"number","minimum":10,"maximum":75000},"active":{"type":"boolean","default":true}}},"AdditionalProducts":{"type":"object","additionalProperties":false,"properties":{"link-insertion":{"$ref":"#/components/schemas/AdditionalProductConfiguration","description":"Configuración del producto de inserción de enlaces."},"mention":{"$ref":"#/components/schemas/AdditionalProductConfiguration"},"mention-insertion":{"$ref":"#/components/schemas/AdditionalProductConfiguration"}}},"AdditionalProductsBulk":{"type":"object","additionalProperties":false,"properties":{"link-insertion":{"$ref":"#/components/schemas/AdditionalProductBulkConfiguration","description":"Configuración del producto adicional de inserción de enlaces."},"mention":{"$ref":"#/components/schemas/AdditionalProductBulkConfiguration"},"mention-insertion":{"$ref":"#/components/schemas/AdditionalProductBulkConfiguration"}}},"BaseMediaInput":{"type":"object","additionalProperties":false,"required":["name","price","url","category","languages","regions","topics","submission_email","publication_example"],"properties":{"name":{"type":"string","maxLength":255},"price":{"type":"number","minimum":10,"maximum":75000},"active":{"type":"boolean","default":true},"url":{"type":"string","format":"uri","maxLength":255,"description":"Debe usar HTTPS y un dominio en minúsculas; no puede incluir credenciales, puerto, query ni fragmento, ni terminar en /. Es inmutable."},"category":{"type":"string","enum":["newspaper","blog"],"description":"Categoría del medio; no es product_type."},"languages":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"string"}},"regions":{"type":"array","minItems":1,"items":{"type":"string"}},"topics":{"type":"array","minItems":1,"items":{"type":"string"}},"submission_email":{"type":"string","format":"email"},"contact_email":{"type":"string","format":"email","nullable":true},"publication_example":{"type":"string","format":"uri","description":"Publicación HTTPS dentro del mismo dominio del medio."},"additional_comments":{"type":"string","nullable":true,"maxLength":1000},"num_links":{"type":"integer","minimum":1,"maximum":4},"accept_conflicts_topics":{"type":"boolean"},"conflict_topics":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ConflictTopicConfiguration"}},"extra_home":{"type":"boolean"},"extra_social":{"type":"boolean"},"extra_sponsor":{"type":"boolean"},"extra_dofollow":{"type":"boolean","description":"No puede ser true al mismo tiempo que extra_relsponsor."},"extra_relsponsor":{"type":"boolean","description":"No puede ser true al mismo tiempo que extra_dofollow."},"addons_enabled":{"type":"boolean"}}},"CreateMediaBaseProduct":{"type":"object","additionalProperties":false,"required":["name","price","url","category","languages","regions","topics","submission_email","publication_example"],"properties":{"name":{"type":"string","maxLength":255},"price":{"type":"number","minimum":10,"maximum":75000},"active":{"type":"boolean","default":true},"url":{"type":"string","format":"uri","maxLength":255,"description":"Debe usar HTTPS y un dominio en minúsculas; no puede incluir credenciales, puerto, query ni fragmento, ni terminar en /. Es inmutable."},"category":{"type":"string","enum":["newspaper","blog"],"description":"Categoría del medio; no es product_type."},"languages":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"string"}},"regions":{"type":"array","minItems":1,"items":{"type":"string"}},"topics":{"type":"array","minItems":1,"items":{"type":"string"}},"submission_email":{"type":"string","format":"email"},"contact_email":{"type":"string","format":"email","nullable":true},"publication_example":{"type":"string","format":"uri","description":"Publicación HTTPS dentro del mismo dominio del medio."},"additional_comments":{"type":"string","nullable":true,"maxLength":1000},"num_links":{"type":"integer","minimum":1,"maximum":4},"accept_conflicts_topics":{"type":"boolean"},"conflict_topics":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ConflictTopicConfiguration"}},"extra_home":{"type":"boolean"},"extra_social":{"type":"boolean"},"extra_sponsor":{"type":"boolean"},"extra_dofollow":{"type":"boolean","description":"No puede ser true al mismo tiempo que extra_relsponsor."},"extra_relsponsor":{"type":"boolean","description":"No puede ser true al mismo tiempo que extra_dofollow."},"addons_enabled":{"type":"boolean"}}},"CreateMediaRequest":{"type":"object","additionalProperties":false,"required":["base_product"],"properties":{"base_product":{"$ref":"#/components/schemas/CreateMediaBaseProduct"},"additional_products":{"$ref":"#/components/schemas/AdditionalProducts"}}},"UpdateMediaRequest":{"type":"object","additionalProperties":false,"required":["url"],"properties":{"url":{"type":"string","format":"uri","maxLength":255,"description":"Identifica el medio y no se modifica. Debe cumplir el formato canónico exigido en el alta."},"product_type":{"type":"string","default":"article-with-link","enum":["article-with-link","link-insertion","mention","mention-insertion"]},"price":{"type":"number","minimum":10,"maximum":75000},"active":{"type":"boolean"},"accept_conflicts_topics":{"type":"boolean"},"conflict_topics":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ConflictTopicConfiguration"}},"num_links":{"type":"integer","minimum":0,"maximum":255},"publication_example":{"type":"string","format":"uri"},"additional_comments":{"type":"string","nullable":true,"maxLength":1000},"in_home":{"type":"boolean"},"has_social":{"type":"boolean"},"is_sponsored":{"type":"boolean"},"do_follow":{"type":"boolean","description":"No puede ser true al mismo tiempo que rel_sponsored."},"rel_sponsored":{"type":"boolean","description":"No puede ser true al mismo tiempo que do_follow."}}},"ProviderAdditionalProduct":{"type":"object","nullable":true,"properties":{"active":{"type":"boolean"},"price":{"type":"number"},"updated_at":{"type":"string","format":"date-time"}}},"ProviderMedia":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"category":{"type":"string","enum":["newspaper","blog"]},"product_type":{"type":"string","enum":["article-with-link"]},"name":{"type":"string"},"price":{"type":"number","description":"Precio del proveedor."},"active":{"type":"boolean"},"accept_conflicts_topics":{"type":"boolean"},"conflict_topics":{"type":"object","additionalProperties":{"type":"number"}},"language":{"type":"string","nullable":true},"countries":{"type":"array","items":{"type":"string"}},"topics":{"type":"array","items":{"type":"string"}},"num_links":{"type":"integer","nullable":true},"publication_example":{"type":"string","nullable":true},"additional_comments":{"type":"string","nullable":true},"in_home":{"type":"boolean"},"has_social":{"type":"boolean"},"is_sponsored":{"type":"boolean"},"do_follow":{"type":"boolean"},"rel_sponsored":{"type":"boolean"},"additional_products":{"type":"object","properties":{"link-insertion":{"$ref":"#/components/schemas/ProviderAdditionalProduct","description":"Producto adicional de inserción de enlaces."},"mention":{"$ref":"#/components/schemas/ProviderAdditionalProduct"},"mention-insertion":{"$ref":"#/components/schemas/ProviderAdditionalProduct"}}},"updated_at":{"type":"string","format":"date-time"}}},"ProviderMediaPageResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProviderMedia"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"CreateMediaResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"request_reference":{"type":"string"},"status":{"type":"string","enum":["approved","pending"]},"approved_at":{"type":"string","format":"date-time","nullable":true},"product":{"allOf":[{"$ref":"#/components/schemas/ProviderMedia"}],"nullable":true}}}}},"UpdateMediaResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["approved","pending"]},"request_references":{"type":"array","items":{"type":"string"}},"pending_already_existed":{"type":"boolean"},"product":{"$ref":"#/components/schemas/ProviderMedia"}}}}},"BulkMediaItem":{"type":"object","additionalProperties":false,"required":["base_product"],"properties":{"reference":{"type":"string","maxLength":255,"description":"Referencia opcional del registro en el sistema que realiza la integración. No localiza el medio ni aporta idempotencia."},"base_product":{"$ref":"#/components/schemas/BaseMediaInput"},"additional_products":{"$ref":"#/components/schemas/AdditionalProductsBulk"}}},"BulkMediaRequest":{"type":"object","additionalProperties":false,"required":["items"],"properties":{"items":{"type":"array","minItems":1,"maxItems":100,"items":{"$ref":"#/components/schemas/BulkMediaItem"}}}},"BulkSummary":{"type":"object","description":"En validación utiliza create/update; en ejecución utiliza created/creation_requested/updated.","properties":{"total":{"type":"integer"},"create":{"type":"integer"},"update":{"type":"integer"},"created":{"type":"integer"},"creation_requested":{"type":"integer"},"updated":{"type":"integer"},"unchanged":{"type":"integer"},"pending_approval":{"type":"integer"},"omitted":{"type":"integer"},"errors":{"type":"integer"}}},"BulkItemError":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"messages":{"type":"array","items":{"type":"string"}},"http_status":{"type":"integer"}}},"BulkResultItem":{"type":"object","properties":{"index":{"type":"integer"},"reference":{"type":"string","nullable":true},"url":{"type":"string"},"status":{"type":"string","enum":["ready","success","omitted","error"]},"action":{"type":"string","nullable":true,"enum":["create","update","created","creation_requested","updated","unchanged"]},"approval_status":{"type":"string","nullable":true,"enum":["approved","pending"]},"pending_already_existed":{"type":"boolean"},"ignored_fields":{"type":"array","items":{"type":"string"}},"request_references":{"type":"array","items":{"type":"string"}},"product":{"$ref":"#/components/schemas/ProviderMedia"},"error":{"$ref":"#/components/schemas/BulkItemError"}}},"BulkMediaResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"mode":{"type":"string","enum":["validation","execution"]},"batch_id":{"type":"string","nullable":true,"description":"Identificador generado para una ejecución bulk."},"summary":{"$ref":"#/components/schemas/BulkSummary"},"items":{"type":"array","items":{"$ref":"#/components/schemas/BulkResultItem"}}}}}}}}}