{
  "info": {
    "name": "API VeriFactu · verifactu.co",
    "description": "Colección generada desde la especificación OpenAPI 3.1 de verifactu.co.\n\n**Antes de empezar:** pon tu clave en la variable `api_key` (`sk_test_…` para el sandbox). Las peticiones están en el orden del quickstart, no en orden alfabético.\n\nLa remisión a la AEAT **no es síncrona**: `POST /registros` devuelve `201` con la huella y el QR, pero el estado es `pendiente`. En producción usa webhooks en vez de sondear.\n\nDocumentación: https://verifactu.co/docs/\nOpenAPI: https://verifactu.co/openapi/verifactu-v1.yaml",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{api_key}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://api.verifactu.co/v1",
      "description": "Único host. El entorno lo decide la clave."
    },
    {
      "key": "api_key",
      "value": "sk_test_CAMBIA_ESTO",
      "description": "sk_test_ pega contra preproducción de la AEAT; sk_live_ contra producción."
    },
    {
      "key": "registro_id",
      "value": "reg_9fK2mQ",
      "description": "Se rellena solo tras el primer POST /registros."
    },
    {
      "key": "idempotency_key",
      "value": "F2026/0184",
      "description": "El número de factura. Sin esto, un reintento duplica el registro."
    }
  ],
  "event": [
    {
      "listen": "test",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// Guarda el id del registro para las peticiones siguientes,",
          "// que es lo primero que uno acaba haciendo a mano si no está.",
          "if (pm.response.code === 201) {",
          "    const d = pm.response.json();",
          "    if (d && d.id && d.id.startsWith('reg_')) {",
          "        pm.collectionVariables.set('registro_id', d.id);",
          "    }",
          "}"
        ]
      }
    }
  ],
  "item": [
    {
      "name": "Empezar aquí",
      "item": [
        {
          "name": "1 · Comprobar que la clave funciona",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/emisores",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "emisores"
              ],
              "query": []
            },
            "description": "Listar emisores\n\n`GET /emisores`\n\nDocumentación: https://verifactu.co/docs/"
          },
          "response": []
        },
        {
          "name": "2 · Dar de alta un emisor de pruebas",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/emisores",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "emisores"
              ],
              "query": []
            },
            "description": "Dar de alta un emisor\n\nUn emisor es un NIF que emite facturas. Cada uno tiene su propia\ncadena de huellas, independiente del resto.\n\n`POST /emisores`\n\nDocumentación: https://verifactu.co/docs/",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"nif\": \"89890001K\",\n  \"nombre\": \"EMISOR DE PRUEBAS SL\",\n  \"modalidad\": \"representacion\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "3 · Registrar tu primera factura",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/registros",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "registros"
              ],
              "query": []
            },
            "description": "Registrar una factura\n\nCrea el registro de facturación, calcula su huella encadenada y lo\nencola para remisión. Devuelve huella y QR de inmediato.\n\n`POST /registros`\n\nDocumentación: https://verifactu.co/docs/",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"emisor\": {\n    \"nif\": \"B35123456\"\n  },\n  \"numero\": \"F2026/0184\",\n  \"fecha\": \"2026-08-26\",\n  \"tipo\": \"F1\",\n  \"impuesto\": \"IGIC\",\n  \"base\": 100.0,\n  \"cuota\": 7.0,\n  \"total\": 107.0,\n  \"destinatario\": {\n    \"nif\": \"12345678Z\",\n    \"nombre\": \"CLIENTE DEMO SL\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "4 · Ver la cadena que se somete a SHA-256",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/registros/{{registro_id}}/cadena",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "registros",
                "{{registro_id}}",
                "cadena"
              ],
              "query": []
            },
            "description": "Cadena literal sometida a SHA-256\n\nLos ocho campos como `Campo=valor` unidos por `&`, en el orden de la\nAEAT. Es lo primero que hay que mirar cuando una huella no cuadra.\n\n`GET /registros/{id}/cadena`\n\nDocumentación: https://verifactu.co/docs/"
          },
          "response": []
        },
        {
          "name": "5 · Consultar el resultado de la AEAT",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/registros/{{registro_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "registros",
                "{{registro_id}}"
              ],
              "query": []
            },
            "description": "Consultar un registro\n\nEstado actual, con el CSV si la AEAT ya lo aceptó. En producción usa\nwebhooks en vez de sondear este endpoint.\n\n`GET /registros/{id}`\n\nDocumentación: https://verifactu.co/docs/"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Registros",
      "item": [
        {
          "name": "Listar y filtrar",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/registros",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "registros"
              ],
              "query": [
                {
                  "key": "emisor",
                  "value": "",
                  "disabled": true,
                  "description": "NIF del emisor."
                },
                {
                  "key": "estado",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "desde",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "hasta",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "Cursor de la página siguiente."
                },
                {
                  "key": "limite",
                  "value": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Listar registros\n\n`GET /registros`\n\nDocumentación: https://verifactu.co/docs/"
          },
          "response": []
        },
        {
          "name": "Anular una factura",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{base_url}}/registros/{{registro_id}}/anulacion",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "registros",
                "{{registro_id}}",
                "anulacion"
              ],
              "query": []
            },
            "description": "Anular una factura\n\nAnular **no es borrar**. Se emite un registro de anulación que entra\nen la misma cadena, encadenado al anterior, con su propia huella.\nSus campos y su orden son distintos a los del alta.\n\n`POST /registros/{id}/anulacion`\n\nDocumentación: https://verifactu.co/docs/"
          },
          "response": []
        },
        {
          "name": "XML remitido (auditoría)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/registros/{{registro_id}}/xml",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "registros",
                "{{registro_id}}",
                "xml"
              ],
              "query": []
            },
            "description": "XML remitido a la AEAT\n\nEl mensaje exacto que se envió, para auditoría.\n\n`GET /registros/{id}/xml`\n\nDocumentación: https://verifactu.co/docs/"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Webhooks y exportación",
      "item": [
        {
          "name": "Registrar una URL de webhook",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/webhooks",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "webhooks"
              ],
              "query": []
            },
            "description": "Registrar una URL de webhook\n\nDevuelve el secreto de firma **una sola vez**. Guárdalo: se usa para\nverificar el HMAC-SHA256 de cada envío.\n\n`POST /webhooks`\n\nDocumentación: https://verifactu.co/docs/",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://tu-app.example/verifactu\",\n  \"eventos\": [\n    \"registro.aceptado\",\n    \"registro.rechazado\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "Exportar en el XML del reglamento",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/exportacion",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "exportacion"
              ],
              "query": [
                {
                  "key": "emisor",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "desde",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "hasta",
                  "value": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Exportar registros y eventos\n\nEl XML estandarizado que exige el reglamento, con las huellas y el\nencadenamiento intactos. Disponible siempre y sin pedir permiso.\n\n`GET /exportacion`\n\nDocumentación: https://verifactu.co/docs/"
          },
          "response": []
        }
      ]
    }
  ]
}