Autentica tus solicitudes con una API key, y crea, rota y revoca tus claves desde Configuración.
Cada solicitud a la API de clientes se autentica con una API key de tu empresa, enviada en el header x-api-key. Tú mismo creas, rotas y revocas tus claves desde Pruff, sin pedirle nada a nadie.
Enviar la clave
Envía el valor completo de la clave, tal como lo viste al crearla, en el header x-api-key de cada solicitud:
Las claves nuevas empiezan con pruff_sk_ y siguen con 64 caracteres. Las claves que tu empresa ya usaba tienen otro formato y funcionan igual, con el mismo valor, sin que tengas que hacer nada.Guarda la clave en tu servidor, por ejemplo en un gestor de secretos o en una variable de entorno. Nunca la expongas en un navegador ni en una aplicación móvil.
Crear una clave
En Pruff, entra a Configuración → Otros → Claves de API.
Elige Crear clave.
Escribe un Nombre de 3 a 120 caracteres. Usa el nombre del sistema que la va a usar, por ejemplo ERP producción.
Elige la Expiración: 30 días, 90 días, 1 año o Sin expiración.
Confirma con Crear clave y copia la clave completa.
Pruff muestra la clave completa una sola vez. Después solo verás sus últimos cuatro caracteres, y no hay forma de recuperar el valor completo. Si lo pierdes, rota la clave.
Crea una clave por sistema. Así, si una se filtra, revocas solo esa y los demás sistemas siguen funcionando. Para administrar claves tu usuario necesita permiso para ello; si no ves la sección o los botones, pídele acceso a un administrador de tu empresa.La lista muestra para cada clave su nombre, sus últimos cuatro caracteres, su estado, cuándo expira y cuándo se usó por última vez. Ese último dato se actualiza como máximo una vez cada 5 minutos.
Estado
Significado
Activa
Funciona.
Expira pronto
Funciona, pero expira en 7 días o menos.
En rotación
Es la clave nueva de una rotación, y la anterior todavía funciona.
Revocada
Dejó de funcionar porque alguien la revocó.
Expirada
Dejó de funcionar porque llegó su fecha de expiración.
Expiración
Una clave con expiración deja de funcionar en el instante en que se cumple su plazo, contado desde su creación. Desde ese momento responde 401 y queda en la lista de claves inactivas. Una clave Sin expiración funciona hasta que la revoques.Una clave expirada no se puede renovar. Crea una nueva o rota la clave antes de que expire: la clave nueva recibe una expiración nueva, del mismo plazo que la original, contado desde la rotación. Una clave sin expiración sigue sin expirar después de rotarla.
Rotar una clave
Rota una clave para cambiar su valor sin cortar tu integración, o cuando sospeches que se filtró.
En Claves de API, elige Rotar en la fila de la clave.
Elige cuánto tiempo sigue funcionando la clave actual:
Deja de funcionar ahora: úsalo si la clave se filtró.
24 horas: para cambiarla sin corte.
7 días: si tu despliegue necesita más tiempo.
Confirma con Rotar clave y copia la clave nueva, que se muestra una sola vez.
La clave nueva conserva el nombre de la actual y recibe una expiración nueva, del mismo plazo que la original, contado desde la rotación. Si la actual no expira, la nueva tampoco. Durante el margen que elegiste, ambas claves funcionan: cambia tu sistema a la clave nueva y, al terminar el margen, la anterior responde 401. La clave nueva aparece como En rotación hasta entonces, junto con la fecha en que la anterior deja de funcionar. La clave anterior sale de la lista en cuanto existe la nueva.Para cortar la clave anterior antes de que termine su margen, revoca la clave nueva: eso termina ambos márgenes y las dos dejan de funcionar de inmediato. Si rotas una clave que todavía tiene una anterior en margen, ese margen termina de inmediato. Puedes rotar tanto claves nuevas como las que tu empresa ya tenía.
Revocar una clave
Revoca una clave cuando un sistema deja de usarla o cuando se filtró y no necesitas un margen.
En Claves de API, elige Revocar en la fila de la clave.
Confirma con Revocar clave.
La revocación es inmediata y no se puede deshacer: toda solicitud con esa clave recibe 401 desde ese momento. La clave queda en la lista de claves inactivas, con la fecha y la persona que la revocó.
Respuesta 401
Una clave que no se puede usar recibe siempre la misma respuesta, sin indicar el motivo:
{ "message": "Unauthorized: Invalid API Key"}
Recibes este 401 cuando:
falta el header x-api-key;
el valor no corresponde a ninguna clave;
la clave fue revocada;
la clave expiró;
la clave fue rotada y terminó su margen;
la cuenta de API de tu empresa no está habilitada.
Para saber cuál es tu caso, revisa el estado de la clave en Configuración → Otros → Claves de API. La clave anterior de una rotación ya no aparece en la lista, así que, si tu sistema sigue usándola, cambia a la clave nueva. Reintentar la misma solicitud no sirve: usa una clave activa.
Límite de solicitudes
Todas las claves de tu empresa comparten un límite de 500 solicitudes por minuto. Las solicitudes rechazadas con 401 no cuentan, porque el límite se aplica después de autenticar. Algunos endpoints tienen además un límite propio, que aparece en su referencia.Al superar el límite recibes 429, con el header Retry-After y un body que indica cuánto esperar:
{ "message": "Rate limit exceeded: 501 requests in the current 60s window, limit is 500. Retry in 12s.", "displayMessage": "Superaste el límite de 500 solicitudes cada 60 segundos. Vuelve a intentarlo en 12 segundos.", "data": { "code": "RATE_LIMIT_EXCEEDED", "scope": "All API keys of your company share this budget.", "limit": 500, "used": 501, "windowSeconds": 60, "retryAfterSeconds": 12, "resetAt": "2026-11-12T13:01:00.000Z", "hint": "Wait until resetAt (or honor the Retry-After header) before retrying. Avoid repeating identical requests: reuse responses you already fetched, use filters and larger pageSize values instead of one request per item, and cap your client concurrency." }}
Espera hasta resetAt, o los segundos de Retry-After, antes de reintentar. Crear más claves no aumenta el límite, porque se comparte entre todas.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Pruff para desarrolladores","description":"Documentación para integrar tus sistemas con Pruff.","colors":{"primary":"#0F23DF","light":"#5B6BFF","dark":"#3446FF"},"logo":{"light":"https://mintcdn.com/pruff/_VrgG8X_mrFG1oH6/logo/light.svg?fit=max\u0026auto=format\u0026n=_VrgG8X_mrFG1oH6\u0026q=85\u0026s=11793a12a1af5ccfeeef3cd436b33dce","dark":"https://mintcdn.com/pruff/_VrgG8X_mrFG1oH6/logo/dark.svg?fit=max\u0026auto=format\u0026n=_VrgG8X_mrFG1oH6\u0026q=85\u0026s=9f4f50b7aa7bdec5374a1d134a3b9d1f","href":"https://pruff.com"},"favicon":"https://mintcdn.com/pruff/_VrgG8X_mrFG1oH6/favicon.svg?fit=max\u0026auto=format\u0026n=_VrgG8X_mrFG1oH6\u0026q=85\u0026s=0611623926cc3ba5323e0e0310d17d7c","seo":{"metatags":{"canonical":"https://docs.pruff.com"}},"fonts":{"family":"Nunito"},"integrations":{"posthog":{"apiKey":"phc_nh7cwXFo7qT2SSPtBkZfno6r2qLU72QZbuAoj4RnRqUQ","sessionRecording":false}},"contextual":{"options":["copy","view","chatgpt","claude","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"languages":[{"language":"es","href":""}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"pruff","hasAudioNarration":false,"actualSubdomain":"pruff","customDomains":["docs.pruff.com"],"gitSource":{"type":"github","owner":"pruff-tech","repo":"pruff-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6af79bac7409863fb0833a70","clientVersion":"0.0.4143","searchFilterCounts":[{"language":"es","tag":"API de clientes","count":63},{"language":"es","tag":"Datahub","count":15},{"language":"es","tag":"Webhooks","count":14},{"language":"es","tag":"Eventos","count":9},{"language":"es","tag":"Reportes","count":7},{"language":"es","tag":"Usuarios","count":7},{"language":"es","tag":"CRM","count":5},{"language":"es","tag":"Facturas","count":5},{"language":"es","tag":"Mercado Público","count":4},{"language":"es","tag":"Archivos","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[],"page":{"pagePath":"api/autenticacion","slug":"/api/autenticacion","pageMetadata":{"title":"Autenticación","description":"Autentica tus solicitudes con una API key, y crea, rota y revoca tus claves desde Configuración.","href":"/api/autenticacion"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Autentica tus solicitudes con una API key, y crea, rota y revoca tus claves desde Configuración.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Cada solicitud a la API de clientes se autentica con una API key de tu empresa, enviada en el header `,_jsx(_components.code,{children:`x-api-key`}),`. Tú mismo creas, rotas y revocas tus claves desde Pruff, sin pedirle nada a nadie.`]}),`\n`,_jsx(Heading,{level:`2`,id:`enviar-la-clave`,children:`Enviar la clave`}),`\n`,_jsxs(_components.p,{children:[`Envía el valor completo de la clave, tal como lo viste al crearla, en el header `,_jsx(_components.code,{children:`x-api-key`}),` de cada solicitud:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://api.pruff.com/api/clients/invoices`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"x-api-key: pruff_sk_\u003ctu-clave>\"`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Las claves nuevas empiezan con `,_jsx(_components.code,{children:`pruff_sk_`}),` y siguen con 64 caracteres. Las claves que tu empresa ya usaba tienen otro formato y funcionan igual, con el mismo valor, sin que tengas que hacer nada.`]}),`\n`,_jsx(_components.p,{children:`Guarda la clave en tu servidor, por ejemplo en un gestor de secretos o en una variable de entorno. Nunca la expongas en un navegador ni en una aplicación móvil.`}),`\n`,_jsx(Heading,{level:`2`,id:`crear-una-clave`,children:`Crear una clave`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`En Pruff, entra a `,_jsx(_components.strong,{children:`Configuración`}),` → `,_jsx(_components.strong,{children:`Otros`}),` → `,_jsx(_components.strong,{children:`Claves de API`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Elige `,_jsx(_components.strong,{children:`Crear clave`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Escribe un `,_jsx(_components.strong,{children:`Nombre`}),` de 3 a 120 caracteres. Usa el nombre del sistema que la va a usar, por ejemplo `,_jsx(_components.code,{children:`ERP producción`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Elige la `,_jsx(_components.strong,{children:`Expiración`}),`: 30 días, 90 días, 1 año o `,_jsx(_components.strong,{children:`Sin expiración`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Confirma con `,_jsx(_components.strong,{children:`Crear clave`}),` y copia la clave completa.`]}),`\n`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Pruff muestra la clave completa una sola vez. Después solo verás sus últimos cuatro caracteres, y no hay forma de recuperar el valor completo. Si lo pierdes, rota la clave.`})}),`\n`,_jsx(_components.p,{children:`Crea una clave por sistema. Así, si una se filtra, revocas solo esa y los demás sistemas siguen funcionando. Para administrar claves tu usuario necesita permiso para ello; si no ves la sección o los botones, pídele acceso a un administrador de tu empresa.`}),`\n`,_jsx(_components.p,{children:`La lista muestra para cada clave su nombre, sus últimos cuatro caracteres, su estado, cuándo expira y cuándo se usó por última vez. Ese último dato se actualiza como máximo una vez cada 5 minutos.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Estado`}),_jsx(_components.th,{children:`Significado`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Activa`}),_jsx(_components.td,{children:`Funciona.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Expira pronto`}),_jsx(_components.td,{children:`Funciona, pero expira en 7 días o menos.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`En rotación`}),_jsx(_components.td,{children:`Es la clave nueva de una rotación, y la anterior todavía funciona.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Revocada`}),_jsx(_components.td,{children:`Dejó de funcionar porque alguien la revocó.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Expirada`}),_jsx(_components.td,{children:`Dejó de funcionar porque llegó su fecha de expiración.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`expiración`,children:`Expiración`}),`\n`,_jsxs(_components.p,{children:[`Una clave con expiración deja de funcionar en el instante en que se cumple su plazo, contado desde su creación. Desde ese momento responde `,_jsx(_components.code,{children:`401`}),` y queda en la lista de claves inactivas. Una clave `,_jsx(_components.strong,{children:`Sin expiración`}),` funciona hasta que la revoques.`]}),`\n`,_jsx(_components.p,{children:`Una clave expirada no se puede renovar. Crea una nueva o rota la clave antes de que expire: la clave nueva recibe una expiración nueva, del mismo plazo que la original, contado desde la rotación. Una clave sin expiración sigue sin expirar después de rotarla.`}),`\n`,_jsx(Heading,{level:`2`,id:`rotar-una-clave`,children:`Rotar una clave`}),`\n`,_jsx(_components.p,{children:`Rota una clave para cambiar su valor sin cortar tu integración, o cuando sospeches que se filtró.`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`En `,_jsx(_components.strong,{children:`Claves de API`}),`, elige `,_jsx(_components.strong,{children:`Rotar`}),` en la fila de la clave.`]}),`\n`,_jsxs(_components.li,{children:[`Elige cuánto tiempo sigue funcionando la clave actual:`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Deja de funcionar ahora`}),`: úsalo si la clave se filtró.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`24 horas`}),`: para cambiarla sin corte.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`7 días`}),`: si tu despliegue necesita más tiempo.`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`Confirma con `,_jsx(_components.strong,{children:`Rotar clave`}),` y copia la clave nueva, que se muestra una sola vez.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`La clave nueva conserva el nombre de la actual y recibe una expiración nueva, del mismo plazo que la original, contado desde la rotación. Si la actual no expira, la nueva tampoco. Durante el margen que elegiste, ambas claves funcionan: cambia tu sistema a la clave nueva y, al terminar el margen, la anterior responde `,_jsx(_components.code,{children:`401`}),`. La clave nueva aparece como `,_jsx(_components.strong,{children:`En rotación`}),` hasta entonces, junto con la fecha en que la anterior deja de funcionar. La clave anterior sale de la lista en cuanto existe la nueva.`]}),`\n`,_jsx(_components.p,{children:`Para cortar la clave anterior antes de que termine su margen, revoca la clave nueva: eso termina ambos márgenes y las dos dejan de funcionar de inmediato. Si rotas una clave que todavía tiene una anterior en margen, ese margen termina de inmediato. Puedes rotar tanto claves nuevas como las que tu empresa ya tenía.`}),`\n`,_jsx(Heading,{level:`2`,id:`revocar-una-clave`,children:`Revocar una clave`}),`\n`,_jsx(_components.p,{children:`Revoca una clave cuando un sistema deja de usarla o cuando se filtró y no necesitas un margen.`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`En `,_jsx(_components.strong,{children:`Claves de API`}),`, elige `,_jsx(_components.strong,{children:`Revocar`}),` en la fila de la clave.`]}),`\n`,_jsxs(_components.li,{children:[`Confirma con `,_jsx(_components.strong,{children:`Revocar clave`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`La revocación es inmediata y no se puede deshacer: toda solicitud con esa clave recibe `,_jsx(_components.code,{children:`401`}),` desde ese momento. La clave queda en la lista de claves inactivas, con la fecha y la persona que la revocó.`]}),`\n`,_jsx(Heading,{level:`2`,id:`respuesta-401`,children:`Respuesta 401`}),`\n`,_jsx(_components.p,{children:`Una clave que no se puede usar recibe siempre la misma respuesta, sin indicar el motivo:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Unauthorized: Invalid API Key\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Recibes este `,_jsx(_components.code,{children:`401`}),` cuando:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`falta el header `,_jsx(_components.code,{children:`x-api-key`}),`;`]}),`\n`,_jsx(_components.li,{children:`el valor no corresponde a ninguna clave;`}),`\n`,_jsx(_components.li,{children:`la clave fue revocada;`}),`\n`,_jsx(_components.li,{children:`la clave expiró;`}),`\n`,_jsx(_components.li,{children:`la clave fue rotada y terminó su margen;`}),`\n`,_jsx(_components.li,{children:`la cuenta de API de tu empresa no está habilitada.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Para saber cuál es tu caso, revisa el estado de la clave en `,_jsx(_components.strong,{children:`Configuración`}),` → `,_jsx(_components.strong,{children:`Otros`}),` → `,_jsx(_components.strong,{children:`Claves de API`}),`. La clave anterior de una rotación ya no aparece en la lista, así que, si tu sistema sigue usándola, cambia a la clave nueva. Reintentar la misma solicitud no sirve: usa una clave activa.`]}),`\n`,_jsx(Heading,{level:`2`,id:`límite-de-solicitudes`,children:`Límite de solicitudes`}),`\n`,_jsxs(_components.p,{children:[`Todas las claves de tu empresa comparten un límite de 500 solicitudes por minuto. Las solicitudes rechazadas con `,_jsx(_components.code,{children:`401`}),` no cuentan, porque el límite se aplica después de autenticar. Algunos endpoints tienen además un límite propio, que aparece en su referencia.`]}),`\n`,_jsxs(_components.p,{children:[`Al superar el límite recibes `,_jsx(_components.code,{children:`429`}),`, con el header `,_jsx(_components.code,{children:`Retry-After`}),` y un body que indica cuánto esperar:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`14`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`14`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Rate limit exceeded: 501 requests in the current 60s window, limit is 500. Retry in 12s.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"displayMessage\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Superaste el límite de 500 solicitudes cada 60 segundos. Vuelve a intentarlo en 12 segundos.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"data\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"RATE_LIMIT_EXCEEDED\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"scope\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"All API keys of your company share this budget.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"limit\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`500`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"used\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`501`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"windowSeconds\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`60`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"retryAfterSeconds\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`12`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"resetAt\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2026-11-12T13:01:00.000Z\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"hint\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Wait until resetAt (or honor the Retry-After header) before retrying. Avoid repeating identical requests: reuse responses you already fetched, use filters and larger pageSize values instead of one request per item, and cap your client concurrency.\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Espera hasta `,_jsx(_components.code,{children:`resetAt`}),`, o los segundos de `,_jsx(_components.code,{children:`Retry-After`}),`, antes de reintentar. Crear más claves no aumenta el límite, porque se comparte entre todas.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Autenticación","description":"Autentica tus solicitudes con una API key, y crea, rota y revoca tus claves desde Configuración.","href":"/api/autenticacion"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Enviar la clave","slug":"enviar-la-clave","depth":2,"children":[]},{"title":"Crear una clave","slug":"crear-una-clave","depth":2,"children":[]},{"title":"Expiración","slug":"expiración","depth":2,"children":[]},{"title":"Rotar una clave","slug":"rotar-una-clave","depth":2,"children":[]},{"title":"Revocar una clave","slug":"revocar-una-clave","depth":2,"children":[]},{"title":"Respuesta 401","slug":"respuesta-401","depth":2,"children":[]},{"title":"Límite de solicitudes","slug":"límite-de-solicitudes","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"pruff","siteName":"Pruff para desarrolladores","title":"Autenticación - Pruff para desarrolladores","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"es":{"href":"/api/autenticacion","matchLevel":0}}},"lastModified":"2026-11-12T23:22:38.148Z","originalFileLocation":"api/autenticacion.mdx","locale":"es"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Autentica tus solicitudes con una API key, y crea, rota y revoca tus claves desde Configuración.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Pruff para desarrolladores\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/pruff/2LBj8zUEvuREgD5l/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/pruff/2LBj8zUEvuREgD5l/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/pruff/2LBj8zUEvuREgD5l/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/pruff/2LBj8zUEvuREgD5l/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/pruff/2LBj8zUEvuREgD5l/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/pruff/2LBj8zUEvuREgD5l/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/pruff/2LBj8zUEvuREgD5l/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/pruff/2LBj8zUEvuREgD5l/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/pruff/2LBj8zUEvuREgD5l/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Autenticación - Pruff para desarrolladores\">\u003cmeta data-mint-head property=\"og:description\" content=\"Autentica tus solicitudes con una API key, y crea, rota y revoca tus claves desde Configuración.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Pruff para desarrolladores\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.pruff.com/api/autenticacion\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://pruff.mintlify.site/_mintlify/api/og/v2?division=API+de+clientes\u0026amp;title=Autenticaci%C3%B3n\u0026amp;description=Autentica+tus+solicitudes+con+una+API+key%2C+y+crea%2C+rota+y+revoca+tus+claves+desde+Configuraci%C3%B3n.\u0026amp;theme=43c89623f3fdaadc937edf6e\u0026amp;signature=08b302494d9e81a4bc19e634ff6249b85dae033269721f3a3721fd7b56018d2d\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Autenticación - Pruff para desarrolladores\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Autentica tus solicitudes con una API key, y crea, rota y revoca tus claves desde Configuración.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://pruff.mintlify.site/_mintlify/api/og/v2?division=API+de+clientes\u0026amp;title=Autenticaci%C3%B3n\u0026amp;description=Autentica+tus+solicitudes+con+una+API+key%2C+y+crea%2C+rota+y+revoca+tus+claves+desde+Configuraci%C3%B3n.\u0026amp;theme=43c89623f3fdaadc937edf6e\u0026amp;signature=08b302494d9e81a4bc19e634ff6249b85dae033269721f3a3721fd7b56018d2d\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/pruff/2LBj8zUEvuREgD5l/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Pruff para desarrolladores\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0F23DF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.pruff.com/api/autenticacion\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api/autenticacion.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.pruff.com/#organization\",\"name\":\"Pruff para desarrolladores\",\"url\":\"https://docs.pruff.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/pruff/_VrgG8X_mrFG1oH6/logo/light.svg?fit=max\u0026auto=format\u0026n=_VrgG8X_mrFG1oH6\u0026q=85\u0026s=11793a12a1af5ccfeeef3cd436b33dce\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.pruff.com#website\",\"name\":\"Pruff para desarrolladores\",\"url\":\"https://docs.pruff.com\",\"publisher\":{\"@id\":\"https://docs.pruff.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.pruff.com/api/autenticacion#webpage\",\"url\":\"https://docs.pruff.com/api/autenticacion\",\"name\":\"Autenticación\",\"description\":\"Autentica tus solicitudes con una API key, y crea, rota y revoca tus claves desde Configuración.\",\"dateModified\":\"2026-11-12T23:22:38.148Z\",\"isPartOf\":{\"@id\":\"https://docs.pruff.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.pruff.com/api/autenticacion#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.pruff.com/api/autenticacion#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API de clientes\",\"item\":\"https://docs.pruff.com/api/introduccion\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Autenticación\",\"item\":\"https://docs.pruff.com/api/autenticacion\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.pruff.com/api/autenticacion#article\",\"headline\":\"Autenticación\",\"name\":\"Autenticación\",\"description\":\"Autentica tus solicitudes con una API key, y crea, rota y revoca tus claves desde Configuración.\",\"url\":\"https://docs.pruff.com/api/autenticacion\",\"mainEntityOfPage\":{\"@id\":\"https://docs.pruff.com/api/autenticacion#webpage\"},\"dateModified\":\"2026-11-12T23:22:38.148Z\",\"publisher\":{\"@id\":\"https://docs.pruff.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.pruff.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Pruff para desarrolladores\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Pruff para desarrolladores\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api/autenticacion.md","siteName":"Pruff para desarrolladores","nav":{"global":null,"languages":[{"language":"es","groups":[{"group":"Inicio","pages":[{"title":"Pruff para desarrolladores","href":""}]},{"group":"API de clientes","pages":[{"title":"API de clientes","sidebarTitle":"Introducción","description":"Consulta y opera los datos de tu empresa en Pruff desde tus sistemas.","href":"/api/introduccion"},{"title":"Autenticación","href":"/api/autenticacion"},{"group":"Facturas","pages":[{"title":"Obtener facturas","openapi":"openapi/clients.yaml GET /invoices","description":"Lista las facturas electrónicas (DTE) registradas en Pruff a las que tiene acceso tu empresa, de forma paginada y ordenada por fecha de emisión descendente (las más recientes primero) y, si dos facturas tienen la misma fecha, por `id` descendente. El orden es estable: al recorrer todas las páginas ninguna factura se repite ni se pierde.\n\nTodos los filtros son opcionales y se combinan entre sí: una factura debe cumplir todos los que envíes. Los filtros de texto (`businessName`, `folio`) buscan coincidencia exacta.\n\nCada factura incluye su estado, el monto de sus notas de crédito y de débito, el detalle de las notas de crédito y el historial de cesiones. Una nota de crédito recién emitida puede tardar en aparecer hasta que Pruff la asocia a su factura.\n\nEl valor de `status` se calcula así, en este orden: si la factura tiene cesiones, es `Transable` cuando la última cesión la devolvió al emisor y `Cedida` en cualquier otro caso; si no tiene cesiones, es `Reclamada` si fue reclamada, `Nota de crédito` si la suma de sus notas de crédito, descontadas las notas de débito que las anulan, es exactamente igual al monto, `Pago al contado` si se pagó al contado y `Transable` en cualquier otro caso.","href":"/api/facturas/obtener-facturas"},{"title":"Consultar varias facturas","openapi":"openapi/clients.yaml POST /invoices/search","href":"/api/facturas/consultar-varias-facturas"},{"title":"Obtener facturas transables","openapi":"openapi/clients.yaml GET /invoices/financiable","href":"/api/facturas/obtener-facturas-transables"},{"title":"Obtener cesiones","openapi":"openapi/clients.yaml GET /cessions","href":"/api/facturas/obtener-cesiones"},{"title":"Obtener notas de crédito","openapi":"openapi/clients.yaml GET /creditNotes","href":"/api/facturas/obtener-notas-de-credito"}]},{"group":"Documentos","pages":[{"title":"Obtener documentos","openapi":"openapi/clients.yaml GET /documents","href":"/api/documentos/obtener-documentos"},{"title":"Crear documentos","openapi":"openapi/clients.yaml POST /documents","href":"/api/documentos/crear-documentos"}]},{"group":"Archivos","pages":[{"title":"Subir archivos a una operación","openapi":"openapi/clients.yaml POST /files/requestType/{requestType}/requestId/{requestId}","href":"/api/archivos/subir-archivos-a-una-operacion"},{"title":"Listar requerimientos de documentos","openapi":"openapi/clients.yaml GET /requirements","href":"/api/archivos/listar-requerimientos-de-documentos"},{"title":"Subir documento a un requerimiento","openapi":"openapi/clients.yaml POST /requirements/record","href":"/api/archivos/subir-documento-a-un-requerimiento"}]},{"group":"Financiamiento","pages":[{"title":"Simular crédito","openapi":"openapi/clients.yaml POST /financing/creditRequest/simulation","href":"/api/financiamiento/simular-credito"},{"title":"Crear solicitud de factoring","openapi":"openapi/clients.yaml POST /financing/factoringRequest/create","href":"/api/financiamiento/crear-solicitud-de-factoring"},{"title":"Obtener prórrogas","openapi":"openapi/clients.yaml GET /financing/extensions","href":"/api/financiamiento/obtener-prorrogas"}]},{"group":"Comité","pages":[{"title":"Obtener aprobaciones","openapi":"openapi/clients.yaml GET /approvals/all/{requestType}/{requestId}","href":"/api/comite/obtener-aprobaciones"},{"title":"Obtener aprobaciones faltantes","openapi":"openapi/clients.yaml GET /approvals/missing/{requestType}/{requestId}","href":"/api/comite/obtener-aprobaciones-faltantes"},{"title":"Aprobar o rechazar una solicitud","openapi":"openapi/clients.yaml POST /approvals/submitApproval/{requestType}/{requestId}","href":"/api/comite/aprobar-o-rechazar-una-solicitud"}]},{"group":"Chat","pages":[{"title":"Exportar chat de una solicitud","openapi":"openapi/clients.yaml GET /chat/export/{requestType}/{requestId}","href":"/api/chat/exportar-chat-de-una-solicitud"},{"title":"Enviar mensaje al chat de una solicitud","openapi":"openapi/clients.yaml POST /chat/send/{requestType}/{requestId}/{email}","href":"/api/chat/enviar-mensaje-al-chat-de-una-solicitud"}]},{"group":"Reportes","pages":[{"title":"Obtener libro de curse","openapi":"openapi/clients.yaml GET /reporting/transactionBook","href":"/api/reportes/obtener-libro-de-curse"},{"title":"Obtener cartera","openapi":"openapi/clients.yaml GET /reporting/portfolio","href":"/api/reportes/obtener-cartera"},{"title":"Obtener detalle de un documento","openapi":"openapi/clients.yaml GET /reporting/document/{documentId}","href":"/api/reportes/obtener-detalle-de-un-documento"},{"title":"Obtener solicitud de financiamiento","openapi":"openapi/clients.yaml GET /reporting/request/{requestType}/{requestId}","href":"/api/reportes/obtener-solicitud-de-financiamiento"},{"title":"Obtener recaudaciones","openapi":"openapi/clients.yaml GET /reporting/collection","href":"/api/reportes/obtener-recaudaciones"},{"title":"Obtener cuentas pendientes","openapi":"openapi/clients.yaml GET /reporting/pendingAccounts","href":"/api/reportes/obtener-cuentas-pendientes"},{"title":"Obtener flujos","openapi":"openapi/clients.yaml GET /reporting/cashFlows","href":"/api/reportes/obtener-flujos"}]},{"group":"Datahub","pages":[{"title":"Verificar cliente enrolado","openapi":"openapi/clients.yaml GET /datahub/isEnrolled/{identifier}","href":"/api/datahub/verificar-cliente-enrolado"},{"title":"Enrolar cliente","openapi":"openapi/clients.yaml POST /datahub/enroll","href":"/api/datahub/enrolar-cliente"},{"title":"Asociar usuario a cliente","openapi":"openapi/clients.yaml POST /datahub/associateUser","href":"/api/datahub/asociar-usuario-a-cliente"},{"title":"Obtener F29","openapi":"openapi/clients.yaml GET /datahub/{identifier}/f29","href":"/api/datahub/obtener-f29"},{"title":"Obtener F22","openapi":"openapi/clients.yaml GET /datahub/{identifier}/f22","href":"/api/datahub/obtener-f22"},{"title":"Obtener deuda cliente","openapi":"openapi/clients.yaml GET /datahub/{identifier}/debt","href":"/api/datahub/obtener-deuda"},{"title":"Obtener resumen de cesiones","openapi":"openapi/clients.yaml GET /datahub/{identifier}/cessions/summary","href":"/api/datahub/obtener-resumen-de-cesiones"},{"title":"Obtener resumen de facturas","openapi":"openapi/clients.yaml GET /datahub/{identifier}/invoices/summary","href":"/api/datahub/obtener-resumen-de-facturas"},{"title":"Obtener informe de buró","openapi":"openapi/clients.yaml GET /datahub/{identifier}/buro","href":"/api/datahub/obtener-buro"},{"title":"Obtener historial de buró","openapi":"openapi/clients.yaml GET /datahub/{identifier}/buro/history","href":"/api/datahub/obtener-historial-de-buro"},{"title":"Obtener perfil del deudor","openapi":"openapi/clients.yaml GET /datahub/{identifier}/stakeholderProfile","href":"/api/datahub/obtener-perfil-del-deudor"},{"title":"Solicitar consultas de Datahub","openapi":"openapi/clients.yaml POST /datahub/request","href":"/api/datahub/solicitar-consultas"},{"title":"Obtener resultado de consultas de Datahub","openapi":"openapi/clients.yaml GET /datahub/response/{id}","href":"/api/datahub/obtener-resultado-de-consultas"},{"title":"Consultar la NDF","href":"/api/datahub/consultar-ndf"},{"title":"Consultar la situación tributaria","href":"/api/datahub/consultar-situacion-tributaria"}]},{"group":"Mercado Público","pages":[{"title":"Listar licitaciones","openapi":"openapi/clients.yaml GET /datahub/publicMarket/tenders","href":"/api/mercado-publico/listar-licitaciones"},{"title":"Obtener detalle de una licitación","openapi":"openapi/clients.yaml GET /datahub/publicMarket/tenders/{code}","href":"/api/mercado-publico/obtener-detalle-de-una-licitacion"},{"title":"Listar órdenes de compra","openapi":"openapi/clients.yaml GET /datahub/publicMarket/purchaseOrders","href":"/api/mercado-publico/listar-ordenes-de-compra"},{"title":"Obtener detalle de una orden de compra","openapi":"openapi/clients.yaml GET /datahub/publicMarket/purchaseOrders/{code}","href":"/api/mercado-publico/obtener-detalle-de-una-orden-de-compra"}]},{"group":"CRM","pages":[{"title":"Listar empresas","openapi":"openapi/clients.yaml GET /businesses","href":"/api/crm/listar-empresas"},{"title":"Obtener pipeline comercial","openapi":"openapi/clients.yaml GET /crm/pipeline","href":"/api/crm/obtener-pipeline-comercial"},{"title":"Obtener prospectos","openapi":"openapi/clients.yaml GET /crm/opportunities","href":"/api/crm/obtener-prospectos"},{"title":"Obtener gestiones comerciales","openapi":"openapi/clients.yaml GET /crm/activities","href":"/api/crm/obtener-gestiones-comerciales"},{"title":"Obtener simulaciones","openapi":"openapi/clients.yaml GET /crm/simulations","href":"/api/crm/obtener-simulaciones"}]},{"group":"SGR","pages":[{"title":"Obtener operaciones SGR","openapi":"openapi/clients.yaml GET /sgr/operations","href":"/api/sgr/obtener-operaciones-sgr"}]},{"group":"Sincronizador","pages":[{"title":"Listar últimas sincronizaciones","openapi":"openapi/clients.yaml GET /syncronizations","href":"/api/sincronizador/listar-ultimas-sincronizaciones"},{"title":"Obtener estado de sincronización","openapi":"openapi/clients.yaml GET /syncronizations/status/{scrapingType}/{businessIdentifier}","href":"/api/sincronizador/obtener-estado-de-sincronizacion"},{"title":"Sincronizar cliente","openapi":"openapi/clients.yaml POST /syncronizations/execute/{scrapingType}/{businessIdentifier}","href":"/api/sincronizador/sincronizar-cliente"}]},{"group":"Usuarios","pages":[{"title":"Crear usuario","openapi":"openapi/clients.yaml POST /user/create","href":"/api/usuarios/crear-usuario"},{"title":"Editar usuario","openapi":"openapi/clients.yaml PATCH /user/update","href":"/api/usuarios/editar-usuario"},{"title":"Eliminar usuario","openapi":"openapi/clients.yaml DELETE /user/delete","href":"/api/usuarios/eliminar-usuario"},{"title":"Obtener perfil de un usuario","openapi":"openapi/clients.yaml GET /user/profile/{email}","href":"/api/usuarios/obtener-perfil-de-un-usuario"},{"title":"Asignar subordinado","openapi":"openapi/clients.yaml PATCH /user/subordinate/assign","href":"/api/usuarios/asignar-subordinado"},{"title":"Quitar subordinado","openapi":"openapi/clients.yaml PATCH /user/subordinate/remove","href":"/api/usuarios/quitar-subordinado"},{"title":"Obtener cuentas de un usuario","openapi":"openapi/clients.yaml GET /wallet/user/{email}","href":"/api/usuarios/obtener-cuentas-de-un-usuario"}]},{"group":"Contactos","pages":[{"title":"Crear contacto de una empresa","openapi":"openapi/clients.yaml POST /contacts","href":"/api/contactos/crear-contacto-de-una-empresa"}]}]},{"group":"Webhooks","pages":[{"title":"Webhooks","sidebarTitle":"Introducción","href":"/webhooks/introduccion"},{"title":"Configuración de la suscripción","sidebarTitle":"Configuración","href":"/webhooks/configuracion"},{"title":"Evento de prueba","href":"/webhooks/prueba"},{"title":"Headers y firma","href":"/webhooks/seguridad"},{"title":"Entregas y reintentos","href":"/webhooks/entregas"},{"group":"Eventos","pages":[{"title":"request.updateStatus","openapi":"openapi/webhooks.yaml webhook request.updateStatus","href":"/webhooks/eventos/request-update-status"},{"title":"business.newEnrollment","openapi":"openapi/webhooks.yaml webhook business.newEnrollment","href":"/webhooks/eventos/business-new-enrollment"},{"title":"approvals.submitted","openapi":"openapi/webhooks.yaml webhook approvals.submitted","href":"/webhooks/eventos/approvals-submitted"},{"title":"invoice.newInvoices","openapi":"openapi/webhooks.yaml webhook invoice.newInvoices","href":"/webhooks/eventos/invoice-new-invoices"},{"title":"cession.newCessions","openapi":"openapi/webhooks.yaml webhook cession.newCessions","href":"/webhooks/eventos/cession-new-cessions"},{"title":"creditNote.newCreditNotes","openapi":"openapi/webhooks.yaml webhook creditNote.newCreditNotes","href":"/webhooks/eventos/credit-note-new-credit-notes"},{"title":"invoice.updateInvoice","openapi":"openapi/webhooks.yaml webhook invoice.updateInvoice","href":"/webhooks/eventos/invoice-update-invoice"},{"title":"request.allDocumentsCeded","openapi":"openapi/webhooks.yaml webhook request.allDocumentsCeded","href":"/webhooks/eventos/request-all-documents-ceded"},{"title":"request.allDocumentsVerified","openapi":"openapi/webhooks.yaml webhook request.allDocumentsVerified","href":"/webhooks/eventos/request-all-documents-verified"}]}]},{"group":"Conector MCP","pages":[{"title":"Conector MCP","sidebarTitle":"Introducción","href":"/mcp/introduccion"},{"title":"Conectar el MCP","sidebarTitle":"Conectar","href":"/mcp/conectar"},{"title":"Preguntas frecuentes del conector MCP","sidebarTitle":"Preguntas frecuentes","href":"/mcp/preguntas-frecuentes"}]}]}]},"basePath":"","title":"Autenticación - Pruff para desarrolladores","buildId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","deploymentId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","dynamics":[],"chunks":[]}