# Introducción

Con más de 100k descargas, desde el 2017, Afip SDK es la plataforma preferida entre los desarrolladores para conectarse a los web services de ARCA.

### Introducción

Con más de 100k descargas, desde el 2017, Afip SDK es la plataforma preferida entre los desarrolladores para conectarse a los servicios de ARCA.

{% hint style="info" %}
Si estás buscando usar las automatizaciones, debés ir a la [documentación de las automatizaciones](https://afipsdk.com/docs/automations/introduction/).
{% endhint %}

### Requisitos previos

Si es tu primera vez conectándote con los web services de ARCA, te recomiendo primero leer esta guía:

{% embed url="<https://afipsdk.com/blog/conectar-tu-sistema-con-los-web-services-de-de-arca/>" %}

### Integración

Aprende cómo usar Afip SDK en tu proyecto.

<table data-column-title-hidden data-view="cards"><thead><tr><th></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Integración en Node.js</strong></td><td><a href="/files/8AOkeTRPWRvCGTbGDFIN">/files/8AOkeTRPWRvCGTbGDFIN</a></td><td><a href="/pages/69b1EPi4ubWTWt3fJVSR">/pages/69b1EPi4ubWTWt3fJVSR</a></td></tr><tr><td><strong>Integración en Serverless</strong></td><td><a href="/files/S8xC1wVv2j10ye0wUVjP">/files/S8xC1wVv2j10ye0wUVjP</a></td><td><a href="/pages/nfT5YvYXiOLFrMZv01Cc">/pages/nfT5YvYXiOLFrMZv01Cc</a></td></tr><tr><td><strong>Integración en AI Builders</strong></td><td><a href="/files/Y5TtpxabeMPv8wiIUqF9">/files/Y5TtpxabeMPv8wiIUqF9</a></td><td><a href="/pages/kuOiGQqe1ix8TsDjhlPd">/pages/kuOiGQqe1ix8TsDjhlPd</a></td></tr><tr><td><strong>Integración en PHP</strong></td><td><a href="/files/s29p5z85OcfhdPlC5BAd">/files/s29p5z85OcfhdPlC5BAd</a></td><td><a href="/pages/EITQ3ebJAhmP4xI9qUOe">/pages/EITQ3ebJAhmP4xI9qUOe</a></td></tr><tr><td><strong>Integración en Python</strong></td><td><a href="/files/j9gj3600RofVcYOafDPE">/files/j9gj3600RofVcYOafDPE</a></td><td><a href="/pages/NHWKHZie3c39ShmAGfGz">/pages/NHWKHZie3c39ShmAGfGz</a></td></tr><tr><td><strong>Integración en Ruby</strong></td><td><a href="/files/8xpXB7K1IzPBqUxmDXG1">/files/8xpXB7K1IzPBqUxmDXG1</a></td><td><a href="/pages/RuMHGymahToR6du0fNGT">/pages/RuMHGymahToR6du0fNGT</a></td></tr><tr><td><strong>Integración via API</strong></td><td><a href="/files/G6fqwa8XSG6Ffhc00E1y">/files/G6fqwa8XSG6Ffhc00E1y</a></td><td><a href="/pages/ag6ZWvt9QS4KgSGTkkkC">/pages/ag6ZWvt9QS4KgSGTkkkC</a></td></tr><tr><td><strong>Integración en VFP</strong></td><td><a href="/files/jUP5tZsuXtwXuCdGRuDv">/files/jUP5tZsuXtwXuCdGRuDv</a></td><td><a href="/pages/Sq8FHTIn2uYdRhYdaWeT">/pages/Sq8FHTIn2uYdRhYdaWeT</a></td></tr><tr><td><strong>Integración en VB6</strong></td><td><a href="/files/xNuzMCKrILYzuwKNiy4u">/files/xNuzMCKrILYzuwKNiy4u</a></td><td><a href="/pages/s9lTaUpzvImgV3temnzB">/pages/s9lTaUpzvImgV3temnzB</a></td></tr><tr><td><strong>Integración en .NET</strong></td><td><a href="/files/aTgsHcFRY7YbRtenQrRC">/files/aTgsHcFRY7YbRtenQrRC</a></td><td><a href="/pages/o4XjZSH5DWMZu6tLROCE">/pages/o4XjZSH5DWMZu6tLROCE</a></td></tr><tr><td><strong>Integración en Java</strong></td><td><a href="/files/WRthbXHdCQ1OD2KYMl5z">/files/WRthbXHdCQ1OD2KYMl5z</a></td><td><a href="/pages/QMIZVX6YW84hPdkVaz13">/pages/QMIZVX6YW84hPdkVaz13</a></td></tr><tr><td><strong>Integración en Flutter</strong></td><td><a href="/files/4lwr4lHOWpRrp9ddIdWG">/files/4lwr4lHOWpRrp9ddIdWG</a></td><td><a href="/pages/hgzjnS1mPbHPGHa6NPhq">/pages/hgzjnS1mPbHPGHa6NPhq</a></td></tr><tr><td><strong>Integración en Go</strong></td><td><a href="/files/bMXOdSJgJJ4S2b8HNN1j">/files/bMXOdSJgJJ4S2b8HNN1j</a></td><td><a href="/pages/y44Ucjs3xcQw6bJiNNRi">/pages/y44Ucjs3xcQw6bJiNNRi</a></td></tr><tr><td><strong>Integración en n8n</strong></td><td><a href="/files/a8IpWFAmtLZ27uErwM2U">/files/a8IpWFAmtLZ27uErwM2U</a></td><td><a href="/pages/s6rrsc3Poqa5zlY8FAAu">/pages/s6rrsc3Poqa5zlY8FAAu</a></td></tr><tr><td><strong>Integración en Make</strong></td><td><a href="/files/h4soEi7ShuvieeMAQDQx">/files/h4soEi7ShuvieeMAQDQx</a></td><td><a href="/pages/ySdVcx9ZYPtvee8Tkca3">/pages/ySdVcx9ZYPtvee8Tkca3</a></td></tr><tr><td><strong>Integración en Bubble</strong></td><td><a href="/files/A5WTJIAQcyJ3aB7vvka0">/files/A5WTJIAQcyJ3aB7vvka0</a></td><td><a href="/pages/9ziMdoe1o8gmNbV9dzqM">/pages/9ziMdoe1o8gmNbV9dzqM</a></td></tr><tr><td><strong>Integración en Zapier</strong></td><td><a href="/files/WKgdvDZu8RV7uEcVb7wF">/files/WKgdvDZu8RV7uEcVb7wF</a></td><td><a href="/pages/KCGsDSSNMqqnVEDTzqF5">/pages/KCGsDSSNMqqnVEDTzqF5</a></td></tr><tr><td><strong>Integración en Pipedream</strong></td><td><a href="/files/L1Knb14EHjLu62VpUJT9">/files/L1Knb14EHjLu62VpUJT9</a></td><td><a href="/pages/EyPwTuMdMZLm1SZN4Bmq">/pages/EyPwTuMdMZLm1SZN4Bmq</a></td></tr></tbody></table>

### Siguientes pasos

Una vez integrado, ya estás listo para usar los web services y, luego, ir a producción.

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Web services</strong></td><td>Documentación de uso de cada web service.</td><td><a href="/pages/mVTz5YrKc8PCEeJKHt0W">/pages/mVTz5YrKc8PCEeJKHt0W</a></td></tr><tr><td><strong>Ir a producción</strong></td><td>Una vez tengas tu sistema listo, debés seguir este tutorial para ir a producción.</td><td><a href="/pages/82rEIYXj2XJdm9h1pWKf">/pages/82rEIYXj2XJdm9h1pWKf</a></td></tr></tbody></table>

### Recursos

La documentación que necesitás en cada paso del desarrollo.

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Tutoriales página de ARCA</strong></td><td>Paso a paso para no perderse en la página de ARCA.</td><td><a href="/pages/SRdNRC4TnpOxxBYTIOi6">/pages/SRdNRC4TnpOxxBYTIOi6</a></td></tr><tr><td><strong>Otros métodos útiles</strong></td><td>Para facilitar el desarrollo.</td><td><a href="/pages/DexL0nExV0sSrFtkKL4C">/pages/DexL0nExV0sSrFtkKL4C</a></td></tr><tr><td><strong>Preguntas frecuentes</strong></td><td>Resolvé las dudas más comunes.</td><td><a href="/pages/DY81k5IWCS5fvkhta0Sh">/pages/DY81k5IWCS5fvkhta0Sh</a></td></tr><tr><td><strong>Errores frecuentes</strong></td><td>Resolvé los errores más comunes.</td><td><a href="/pages/sTwU8r6JrmRvK0NChEOB">/pages/sTwU8r6JrmRvK0NChEOB</a></td></tr></tbody></table>


# Node.js

Aprendé cómo usar Afip SDK con Node.js.

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá la librería de Afip SDK en Node.js.

{% tabs %}
{% tab title="npm" %}

```bash
npm install @afipsdk/afip.js
```

{% endtab %}

{% tab title="yarn" %}

```bash
yarn add @afipsdk/afip.js
```

{% endtab %}

{% tab title="pnpm" %}

```bash
pnpm add @afipsdk/afip.js
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="server.ts" %}

```javascript
import Afip from '@afipsdk/afip.js';

const afip = new Afip({ 
    CUIT: 20409378472,
    access_token: 'TU_ACCESS_TOKEN' // Obtenido de https://app.afipsdk.com
});
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para JavaScript:

{% embed url="<https://afipsdk.com/blog/category/Javascript/>" %}

Y un proyecto de ejemplo listo para usar:

{% embed url="<https://github.com/AfipSDK/afip-sdk-billing-example-js>" %}

### Integraciones por framework

Si estás trabajando con un framework o plataforma Node.js, podés seguir una guía específica para organizar la configuración, variables de entorno y servicios dentro de la estructura del proyecto.

{% content-ref url="/pages/5CGz6d2zOmz7JeoI0JxX" %}
[Next.js](/integracion/node.js/next-js)
{% endcontent-ref %}

{% content-ref url="/pages/ZzgpFn8bYgcEKNbBvUjq" %}
[Remix](/integracion/node.js/remix)
{% endcontent-ref %}

{% content-ref url="/pages/LKxA59TdEQsqaN7ELozE" %}
[Nuxt](/integracion/node.js/nuxt)
{% endcontent-ref %}

{% content-ref url="/pages/TEMfTypTD51bOkKYZL47" %}
[SvelteKit](/integracion/node.js/sveltekit)
{% endcontent-ref %}

{% content-ref url="/pages/rcDZYIvbPit9so4m6dCG" %}
[Express](/integracion/node.js/express)
{% endcontent-ref %}

{% content-ref url="/pages/YZz6xYtxicwbMlTiCYsi" %}
[RedwoodJS](/integracion/node.js/redwoodjs)
{% endcontent-ref %}

{% content-ref url="/pages/qZiKizHiGBMNjH5diKII" %}
[Hono](/integracion/node.js/hono)
{% endcontent-ref %}

{% content-ref url="/pages/bqGjJWzsa8hpKMRN4zMC" %}
[Bun](/integracion/node.js/bun)
{% endcontent-ref %}

{% content-ref url="/pages/HZazk9t4zWiaZ3EtOJri" %}
[Astro](/integracion/node.js/astro)
{% endcontent-ref %}

{% content-ref url="/pages/KZBsHqRskZpxubL0g3QM" %}
[Railway](/integracion/node.js/railway)
{% endcontent-ref %}

{% content-ref url="/pages/wcDA9sMKtEu2r0UfePVn" %}
[Encore](/integracion/node.js/encore)
{% endcontent-ref %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title="server.ts" %}
{% code fullWidth="true" %}

```javascript
import fs from 'fs';
import Afip from '@afipsdk/afip.js';

// Certificado (Puede estar guardado en archivos, DB, etc)
const cert = fs.readFileSync('ruta/a/certificado.crt', {encoding: 'utf8'});

// Key (Puede estar guardado en archivos, DB, etc)
const key = fs.readFileSync('ruta/a/key.key', {encoding: 'utf8'});

// CUIT del certificado
const CUIT = 20111111112;

const afip = new Afip({ 
    cert, 
    key, 
    CUIT,
    access_token: 'TU_ACCESS_TOKEN' // Obtenido de https://app.afipsdk.com
});
```

{% endcode %}
{% endtab %}
{% endtabs %}


# Next.js

Aprendé cómo usar Afip SDK con Next.js

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá la librería de Afip SDK en tu proyecto Next.js.

{% tabs %}
{% tab title="npm" %}

```bash
npm install @afipsdk/afip.js
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT en tu archivo de ambiente.

{% tabs %}
{% tab title=".env.local" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En Next.js mantené Afip SDK del lado del servidor, por ejemplo en un Route Handler.

{% tabs %}
{% tab title="app/api/arca/route.ts" %}

```typescript
import Afip from "@afipsdk/afip.js";

const afip = new Afip({
  CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
  access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
});

export async function POST() {
  // Tu llamada de Afip SDK acá

  return Response.json({ ok: true });
}
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para JavaScript:

{% embed url="<https://afipsdk.com/blog/category/Javascript/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title=".env.local" %}

```bash
AFIPSDK_CERT_PATH=/ruta/segura/certificado.crt
AFIPSDK_KEY_PATH=/ruta/segura/key.key
```

{% endtab %}

{% tab title="app/api/arca/route.ts" %}

```typescript
import fs from "fs";
import Afip from "@afipsdk/afip.js";

const afip = new Afip({
  CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
  cert: fs.readFileSync(process.env.AFIPSDK_CERT_PATH!, "utf8"),
  key: fs.readFileSync(process.env.AFIPSDK_KEY_PATH!, "utf8"),
  access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
});
```

{% endtab %}
{% endtabs %}


# Remix

Aprendé cómo usar Afip SDK con Remix

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá la librería de Afip SDK en tu proyecto Remix.

{% tabs %}
{% tab title="npm" %}

```bash
npm install @afipsdk/afip.js
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT en tu archivo de ambiente.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En Remix podés centralizar Afip SDK en un módulo server-only y usarlo desde actions o loaders.

{% tabs %}
{% tab title="app/services/afip.server.ts" %}

```typescript
import Afip from "@afipsdk/afip.js";

export function getAfipClient() {
  return new Afip({
    CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
    access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
  });
}
```

{% endtab %}

{% tab title="app/routes/arca.tsx" %}

```typescript
import { json, type ActionFunctionArgs } from "@remix-run/node";
import { getAfipClient } from "~/services/afip.server";

export async function action(_args: ActionFunctionArgs) {
  const afip = getAfipClient();

  // Tu llamada de Afip SDK acá

  return json({ ok: true });
}
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para JavaScript:

{% embed url="<https://afipsdk.com/blog/category/Javascript/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_CERT_PATH=/ruta/segura/certificado.crt
AFIPSDK_KEY_PATH=/ruta/segura/key.key
```

{% endtab %}

{% tab title="app/services/afip.server.ts" %}

```typescript
import fs from "fs";
import Afip from "@afipsdk/afip.js";

export function getAfipClient() {
  return new Afip({
    CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
    cert: fs.readFileSync(process.env.AFIPSDK_CERT_PATH!, "utf8"),
    key: fs.readFileSync(process.env.AFIPSDK_KEY_PATH!, "utf8"),
    access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
  });
}
```

{% endtab %}
{% endtabs %}


# Nuxt

Aprendé cómo usar Afip SDK con Nuxt

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá la librería de Afip SDK en tu proyecto Nuxt.

{% tabs %}
{% tab title="npm" %}

```bash
npm install @afipsdk/afip.js
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT en tu archivo de ambiente.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En Nuxt usá Afip SDK desde `server/`, por ejemplo en un server route.

{% tabs %}
{% tab title="server/api/arca.post.ts" %}

```typescript
import Afip from "@afipsdk/afip.js";

export default defineEventHandler(async () => {
  const afip = new Afip({
    CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
    access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
  });

  // Tu llamada de Afip SDK acá

  return { ok: true };
});
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para JavaScript:

{% embed url="<https://afipsdk.com/blog/category/Javascript/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_CERT_PATH=/ruta/segura/certificado.crt
AFIPSDK_KEY_PATH=/ruta/segura/key.key
```

{% endtab %}

{% tab title="server/api/arca.post.ts" %}

```typescript
import fs from "fs";
import Afip from "@afipsdk/afip.js";

const afip = new Afip({
  CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
  cert: fs.readFileSync(process.env.AFIPSDK_CERT_PATH!, "utf8"),
  key: fs.readFileSync(process.env.AFIPSDK_KEY_PATH!, "utf8"),
  access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
});
```

{% endtab %}
{% endtabs %}


# SvelteKit

Aprendé cómo usar Afip SDK con SvelteKit

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá la librería de Afip SDK en tu proyecto SvelteKit.

{% tabs %}
{% tab title="npm" %}

```bash
npm install @afipsdk/afip.js
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT en tu archivo de ambiente.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En SvelteKit mantené Afip SDK del lado del servidor, por ejemplo en un endpoint.

{% tabs %}
{% tab title="src/routes/arca/+server.ts" %}

```typescript
import Afip from "@afipsdk/afip.js";
import { env } from "$env/dynamic/private";

const afip = new Afip({
  CUIT: Number(env.AFIPSDK_CUIT || 20409378472),
  access_token: env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
});

export async function POST() {
  // Tu llamada de Afip SDK acá

  return Response.json({ ok: true });
}
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para JavaScript:

{% embed url="<https://afipsdk.com/blog/category/Javascript/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_CERT_PATH=/ruta/segura/certificado.crt
AFIPSDK_KEY_PATH=/ruta/segura/key.key
```

{% endtab %}

{% tab title="src/routes/arca/+server.ts" %}

```typescript
import fs from "fs";
import Afip from "@afipsdk/afip.js";
import { env } from "$env/dynamic/private";

const afip = new Afip({
  CUIT: Number(env.AFIPSDK_CUIT || 20409378472),
  cert: fs.readFileSync(env.AFIPSDK_CERT_PATH!, "utf8"),
  key: fs.readFileSync(env.AFIPSDK_KEY_PATH!, "utf8"),
  access_token: env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
});
```

{% endtab %}
{% endtabs %}


# Express

Aprendé cómo usar Afip SDK con Express

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá Express, dotenv y la librería de Afip SDK.

{% tabs %}
{% tab title="npm" %}

```bash
npm install express dotenv @afipsdk/afip.js
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT en tu archivo de ambiente.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En Express podés crear un módulo para centralizar la instancia de Afip SDK y reutilizarla desde rutas o servicios.

{% tabs %}
{% tab title="src/services/afip.js" %}

```javascript
import Afip from "@afipsdk/afip.js";

export function getAfipClient() {
  return new Afip({
    CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
    access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
  });
}
```

{% endtab %}

{% tab title="src/server.js" %}

```javascript
import "dotenv/config";
import express from "express";
import { getAfipClient } from "./services/afip.js";

const app = express();

app.post("/arca", async (_req, res) => {
  const afip = getAfipClient();

  // Tu llamada de Afip SDK acá

  res.json({ ok: true });
});
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para JavaScript:

{% embed url="<https://afipsdk.com/blog/category/Javascript/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_CERT_PATH=/ruta/segura/certificado.crt
AFIPSDK_KEY_PATH=/ruta/segura/key.key
```

{% endtab %}

{% tab title="src/services/afip.js" %}

```javascript
import fs from "fs";
import Afip from "@afipsdk/afip.js";

export function getAfipClient() {
  return new Afip({
    CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
    cert: fs.readFileSync(process.env.AFIPSDK_CERT_PATH, "utf8"),
    key: fs.readFileSync(process.env.AFIPSDK_KEY_PATH, "utf8"),
    access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
  });
}
```

{% endtab %}
{% endtabs %}


# RedwoodJS

Aprendé cómo usar Afip SDK con RedwoodJS

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá la librería de Afip SDK en el workspace `api` de RedwoodJS.

{% tabs %}
{% tab title="yarn" %}

```bash
yarn workspace api add @afipsdk/afip.js
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT en tu archivo de ambiente.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En RedwoodJS usá Afip SDK desde el lado `api`, por ejemplo en un service.

{% tabs %}
{% tab title="api/src/lib/afip.ts" %}

```typescript
import Afip from "@afipsdk/afip.js";

export function getAfipClient() {
  return new Afip({
    CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
    access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
  });
}
```

{% endtab %}

{% tab title="api/src/services/arca/arca.ts" %}

```typescript
import { getAfipClient } from "src/lib/afip";

export const callArca = async () => {
  const afip = getAfipClient();

  // Tu llamada de Afip SDK acá

  return { ok: true };
};
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para JavaScript:

{% embed url="<https://afipsdk.com/blog/category/Javascript/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_CERT_PATH=/ruta/segura/certificado.crt
AFIPSDK_KEY_PATH=/ruta/segura/key.key
```

{% endtab %}

{% tab title="api/src/lib/afip.ts" %}

```typescript
import fs from "fs";
import Afip from "@afipsdk/afip.js";

export function getAfipClient() {
  return new Afip({
    CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
    cert: fs.readFileSync(process.env.AFIPSDK_CERT_PATH!, "utf8"),
    key: fs.readFileSync(process.env.AFIPSDK_KEY_PATH!, "utf8"),
    access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
  });
}
```

{% endtab %}
{% endtabs %}


# Hono

Aprendé cómo usar Afip SDK con Hono

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá Hono y la librería de Afip SDK.

{% tabs %}
{% tab title="npm" %}

```bash
npm install hono @afipsdk/afip.js
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT en tu archivo de ambiente.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En Hono podés crear el cliente dentro de una ruta o helper del lado servidor.

{% tabs %}
{% tab title="src/index.ts" %}

```typescript
import Afip from "@afipsdk/afip.js";
import { Hono } from "hono";

const app = new Hono();

app.post("/arca", async (c) => {
  const afip = new Afip({
    CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
    access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
  });

  // Tu llamada de Afip SDK acá

  return c.json({ ok: true });
});

export default app;
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para JavaScript:

{% embed url="<https://afipsdk.com/blog/category/Javascript/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_CERT_PATH=/ruta/segura/certificado.crt
AFIPSDK_KEY_PATH=/ruta/segura/key.key
```

{% endtab %}

{% tab title="src/index.ts" %}

```typescript
import fs from "fs";
import Afip from "@afipsdk/afip.js";

const afip = new Afip({
  CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
  cert: fs.readFileSync(process.env.AFIPSDK_CERT_PATH!, "utf8"),
  key: fs.readFileSync(process.env.AFIPSDK_KEY_PATH!, "utf8"),
  access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
});
```

{% endtab %}
{% endtabs %}


# Bun

Aprendé cómo usar Afip SDK con Bun

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá la librería de Afip SDK en tu proyecto Bun.

{% tabs %}
{% tab title="Bun" %}

```bash
bun add @afipsdk/afip.js
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT en tu archivo de ambiente.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En Bun podés usar Afip SDK desde un servidor HTTP o desde scripts server-side.

{% tabs %}
{% tab title="src/server.ts" %}

```typescript
import Afip from "@afipsdk/afip.js";

Bun.serve({
  port: 3000,
  async fetch(request) {
    if (request.method !== "POST") {
      return Response.json({ error: "Method not allowed" }, { status: 405 });
    }

    const afip = new Afip({
      CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
      access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
    });

    // Tu llamada de Afip SDK acá

    return Response.json({ ok: true });
  }
});
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para JavaScript:

{% embed url="<https://afipsdk.com/blog/category/Javascript/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_CERT_PATH=/ruta/segura/certificado.crt
AFIPSDK_KEY_PATH=/ruta/segura/key.key
```

{% endtab %}

{% tab title="src/server.ts" %}

```typescript
import Afip from "@afipsdk/afip.js";

const afip = new Afip({
  CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
  cert: await Bun.file(process.env.AFIPSDK_CERT_PATH!).text(),
  key: await Bun.file(process.env.AFIPSDK_KEY_PATH!).text(),
  access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
});
```

{% endtab %}
{% endtabs %}


# Astro

Aprendé cómo usar Afip SDK con Astro

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá la librería de Afip SDK en tu proyecto Astro.

{% tabs %}
{% tab title="npm" %}

```bash
npm install @afipsdk/afip.js
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT en tu archivo de ambiente.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En Astro usá Afip SDK desde endpoints server-side.

{% tabs %}
{% tab title="src/pages/api/arca.ts" %}

```typescript
import type { APIRoute } from "astro";
import Afip from "@afipsdk/afip.js";

export const POST: APIRoute = async () => {
  const afip = new Afip({
    CUIT: Number(import.meta.env.AFIPSDK_CUIT || 20409378472),
    access_token: import.meta.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
  });

  // Tu llamada de Afip SDK acá

  return new Response(JSON.stringify({ ok: true }));
};
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para JavaScript:

{% embed url="<https://afipsdk.com/blog/category/Javascript/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_CERT_PATH=/ruta/segura/certificado.crt
AFIPSDK_KEY_PATH=/ruta/segura/key.key
```

{% endtab %}

{% tab title="src/pages/api/arca.ts" %}

```typescript
import fs from "fs";
import Afip from "@afipsdk/afip.js";

const afip = new Afip({
  CUIT: Number(import.meta.env.AFIPSDK_CUIT || 20409378472),
  cert: fs.readFileSync(import.meta.env.AFIPSDK_CERT_PATH, "utf8"),
  key: fs.readFileSync(import.meta.env.AFIPSDK_KEY_PATH, "utf8"),
  access_token: import.meta.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
});
```

{% endtab %}
{% endtabs %}


# Railway

Aprendé cómo usar Afip SDK en Railway

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)
* Tener un proyecto Node.js desplegable en Railway

### 1. Instalación

Agregá la librería de Afip SDK en tu proyecto Node.js.

{% tabs %}
{% tab title="npm" %}

```bash
npm install @afipsdk/afip.js
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT como variables del servicio en Railway.

{% tabs %}
{% tab title="Railway Variables" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En Railway podés usar Afip SDK desde cualquier backend Node.js. Este ejemplo usa Express.

{% tabs %}
{% tab title="src/server.js" %}

```javascript
import express from "express";
import Afip from "@afipsdk/afip.js";

const app = express();
const port = process.env.PORT || 3000;

app.post("/arca", async (_req, res) => {
  const afip = new Afip({
    CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
    access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
  });

  // Tu llamada de Afip SDK acá

  res.json({ ok: true });
});

app.listen(port);
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para JavaScript:

{% embed url="<https://afipsdk.com/blog/category/Javascript/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego cargá `AFIPSDK_CERT` y `AFIPSDK_KEY` como variables privadas de Railway.

{% tabs %}
{% tab title="Railway Variables" %}

```bash
AFIPSDK_CERT=CONTENIDO_DEL_CERTIFICADO
AFIPSDK_KEY=CONTENIDO_DE_LA_KEY
```

{% endtab %}

{% tab title="src/server.js" %}

```javascript
import Afip from "@afipsdk/afip.js";

const afip = new Afip({
  CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
  cert: process.env.AFIPSDK_CERT,
  key: process.env.AFIPSDK_KEY,
  access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
});
```

{% endtab %}
{% endtabs %}


# Encore

Aprendé cómo usar Afip SDK con Encore

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)
* Tener un proyecto Encore con TypeScript

### 1. Instalación

Agregá la librería de Afip SDK en tu proyecto Encore.

{% tabs %}
{% tab title="npm" %}

```bash
npm install @afipsdk/afip.js
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT como secrets o variables de ambiente.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En Encore podés usar Afip SDK desde un endpoint del backend.

{% tabs %}
{% tab title="arca/arca.ts" %}

```typescript
import Afip from "@afipsdk/afip.js";
import { api } from "encore.dev/api";

export const callArca = api(
  { method: "POST", path: "/arca", expose: true },
  async () => {
    const afip = new Afip({
      CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
      access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
    });

    // Tu llamada de Afip SDK acá

    return { ok: true };
  }
);
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para JavaScript:

{% embed url="<https://afipsdk.com/blog/category/Javascript/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego cargá el certificado y la key como secrets o variables privadas.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_CERT=CONTENIDO_DEL_CERTIFICADO
AFIPSDK_KEY=CONTENIDO_DE_LA_KEY
```

{% endtab %}

{% tab title="arca/arca.ts" %}

```typescript
import Afip from "@afipsdk/afip.js";

const afip = new Afip({
  CUIT: Number(process.env.AFIPSDK_CUIT || 20409378472),
  cert: process.env.AFIPSDK_CERT,
  key: process.env.AFIPSDK_KEY,
  access_token: process.env.AFIPSDK_ACCESS_TOKEN // Obtenido de https://app.afipsdk.com
});
```

{% endtab %}
{% endtabs %}


# Serverless

Aprendé cómo usar Afip SDK en entornos serverless.


# Vercel Functions

Aprendé cómo usar Afip SDK con Vercel Functions.

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá la librería de Afip SDK en Node.js.

{% tabs %}
{% tab title="npm" %}

```bash
npm install @afipsdk/afip.js
```

{% endtab %}
{% endtabs %}

Agregá una variable de ambiente para el access token de AfipSDK.

{% tabs %}
{% tab title=".env.local" %}

```bash
#Obtenido de https://app.afipsdk.com
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN 

```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](https://github.com/AfipSDK/afip-gitbook/blob/main/integracion/serverless/vercel-functions.js.md#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

Crea un archivo en tu proyecto de Next.js en, por ejemplo, `app/api/afipsdk/route.ts`.

{% tabs %}
{% tab title="route.ts" %}

```javascript
import Afip from '@afipsdk/afip.js';

const afip = new Afip({
	CUIT: 20409378472,
	access_token: process.env.AFIPSDK_ACCESS_TOKEN
});

export async function POST() {
	// Tu llamada de afipSDK aqui
}
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title="route.ts" %}
{% code fullWidth="true" %}

```javascript
import fs from 'fs';
import Afip from '@afipsdk/afip.js';

// Certificado (Puede estar guardado en archivos, DB, etc)
const cert = fs.readFileSync('ruta/a/certificado.crt', {encoding: 'utf8'});

// Key (Puede estar guardado en archivos, DB, etc)
const key = fs.readFileSync('ruta/a/key.key', {encoding: 'utf8'});

// CUIT del certificado
const CUIT = 20111111112;

const afip = new Afip({
	cert,
	key,
	CUIT,
	access_token: process.env.AFIPSDK_ACCESS_TOKEN, // Obtenido de https://app.afipsdk.com
});
```

{% endcode %}
{% endtab %}
{% endtabs %}


# Supabase Edge Functions

Aprendé cómo usar Afip SDK con Supabase Edge Functions.

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)
* Tener instalado [Supabase CLI](https://supabase.com/docs/guides/local-development#installation)

### Básicos

Para usar los Web Services de ARCA, vamos a utilizar la [API de Afip SDK](https://github.com/AfipSDK/afip-gitbook/blob/main/integracion/serverless/api.md).

En la [documentación de la API](https://github.com/AfipSDK/afip-gitbook/blob/main/integracion/serverless/api.md) podés consultar todos los parámetros del endpoint.

***

### 1. Instalación

Creá una nueva funcion en tu proyecto con el comando

```bash
supabase functions new afipSDK
```

Agregá el access token de AfipSDK como secreto de tu proyecto.

{% tabs %}
{% tab title="Terminal" %}

```bash
supabase secrets set AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
```

{% endtab %}
{% endtabs %}

### 2. Obtener el Ticket de Acceso (TA)

Antes de llamar a los Web Services de ARCA, necesitás un ticket de acceso (TA), también llamado Token Authorization.

Este TA expira tras un tiempo, pero no tenés que preocuparte por renovarlo: Afip SDK lo cachea y solicita uno nuevo automáticamente si es necesario. Solo llamá a la API y Afip SDK te devuelve el TA correspondiente.

Para obtener el TA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="supabase/functions/afipSDK/index.ts" %}

```typescript
const accessToken = Deno.env.get('AFIPSDK_ACCESS_TOKEN');

Deno.serve(async (_req: Request) => {
	const authResponse = await fetch('https://app.afipsdk.com/api/v1/afip/auth', {
		method: 'POST',
		headers: {
			'Content-Type': 'application/json',
			Authorization: `Bearer ${accessToken}`,
		},
		body: JSON.stringify({
			environment: 'dev',
			tax_id: '20409378472', // CUIT a utilizar
			wsid: 'wsfe',
		}),
	});

	const { token, sign } = await authResponse.json();

	// Tu llamada al Web Service aqui
});
```

{% endtab %}
{% endtabs %}

`token` y `sign` corresponden el TA que nos da ARCA. Debemos enviar estos datos en el body de cada solicitud a los Web Services. En el manual de cada Web Service verás dónde colocarlos.

### 3. Llamar al método del Web Service que necesites

Con el TA ya podés realizar las llamadas a los Web Services que necesites.

Es similar al código para obtener el TA, pero debés cambiar la URL y el body de la request.

Podés encontrar las URLs y los body correspondientes en las pestañas API de la documentación de cada Web Service.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Agregá los secrets desde la terminal de Git Bash:

{% tabs %}
{% tab title="Git Bash" %}

```bash
supabase secrets set AFIP_CERT="$(base64 -w 0 certificado.crt)"
supabase secrets set AFIP_KEY="$(base64 -w 0 key.key)"
```

{% endtab %}
{% endtabs %}

Para probar en local deberás crear un archivo `.env.local` dentro de la carpeta `functions` y pegar el contenido del .cert y .key en base64. En la consola ejecutaremos este comando para copiar el valor al portapapeles:

{% tabs %}
{% tab title="Git Bash" %}

```bash
base64 -w 0 afip-cert.crt | clip
base64 -w 0 afip-key.key | clip
```

{% endtab %}

{% tab title="Linux" %}

```bash
base64 -w 0 afip-cert.crt | xclip -selection clipboard
base64 -w 0 afip-key.key | xclip -selection clipboard
```

{% endtab %}
{% endtabs %}

Y luego los leemos desde las variables de entorno en la función:

{% tabs %}
{% tab title="supabase/functions/afipSDK/index.ts" %}
{% code fullWidth="true" %}

```typescript
// Certificado y Key almacenados como secrets del proyecto en formato base64
const cert = atob(Deno.env.get('AFIP_CERT'));
const key = atob(Deno.env.get('AFIP_KEY'));
const accessToken = Deno.env.get('AFIPSDK_ACCESS_TOKEN');

const authResponse = await fetch('https://app.afipsdk.com/api/v1/afip/auth', {
	method: 'POST',
	headers: {
		'Content-Type': 'application/json',
		Authorization: `Bearer ${accessToken}`,
	},
	body: JSON.stringify({
		environment: 'dev',
		tax_id: '20409378472', // CUIT del certificado
		wsid: 'wsfe',
		cert,
		key,
	}),
});
```

{% endcode %}
{% endtab %}
{% endtabs %}


# Cloudflare Workers

Aprendé cómo usar Afip SDK con Cloudflare Workers.

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)
* Tener instalado [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/install-and-update/)

### 1. Instalación

Creá un nuevo Worker con Wrangler e instalá la librería de Afip SDK.

{% tabs %}
{% tab title="Terminal" %}

```bash
npm create cloudflare@latest afipsdk
cd afipsdk
npm install @afipsdk/afip.js
```

{% endtab %}
{% endtabs %}

Agregá el access token de AfipSDK como secreto del Worker.

{% tabs %}
{% tab title="Terminal" %}

```bash
wrangler secret put AFIPSDK_ACCESS_TOKEN
```

{% endtab %}
{% endtabs %}

Luego modificá el archivo `worker-configuration.d.ts`.

{% tabs %}
{% tab title="Terminal" %}

```typescript
interface Env {
		AFIPSDK_ACCESS_TOKEN: string;
		//AFIP_CERT: string;
		//AFIP_KEY: string;
	}
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="src/index.ts" %}

```typescript
import Afip from '@afipsdk/afip.js';

let afip: Afip;

export default {
	async fetch(request: Request, env: Env): Promise<Response> {
		if (!afip) {
			afip = new Afip({
				CUIT: 20409378472,
				access_token: env.AFIPSDK_ACCESS_TOKEN,
			});
		}

		// Tu llamada de afipSDK aqui
	},
};
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Para agregar los secrets primero debemos obtener el valor de .cert y .key en base64 (guardalo ya que se nos pedirá luego). En la consola ejecutaremos este comando para copiar el valor al portapapeles:

{% tabs %}
{% tab title="Git Bash" %}

```bash
base64 -w 0 afip-cert.crt | clip
base64 -w 0 afip-key.key | clip
```

{% endtab %}

{% tab title="Linux" %}

```bash
base64 -w 0 afip-cert.crt | xclip -selection clipboard
base64 -w 0 afip-key.key | xclip -selection clipboard
```

{% endtab %}
{% endtabs %}

Asignar el valor obtenido en su correspondiente secret:

{% tabs %}
{% tab title="Terminal" %}

```bash
wrangler secret put AFIP_CERT
wrangler secret put AFIP_KEY
```

{% endtab %}
{% endtabs %}

Luego los leemos desde el parámetro `env` en la función:

{% tabs %}
{% tab title="src/index.ts" %}
{% code fullWidth="true" %}

```typescript
import Afip from '@afipsdk/afip.js';

let afip: Afip;

export default {
	async fetch(request: Request, env: Env): Promise<Response> {
		if (!afip) {
			// Certificado y Key almacenados como secrets del Worker
			afip = new Afip({
				cert: atob(env.AFIP_CERT),
				key: atob(env.AFIP_KEY),
				CUIT: 20111111112,
				access_token: env.AFIPSDK_ACCESS_TOKEN, // Obtenido de https://app.afipsdk.com
			});
		}
	},
};
```

{% endcode %}
{% endtab %}
{% endtabs %}


# Deno Deploy

Aprendé cómo usar Afip SDK con Deno Deploy.

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Deno Deploy no requiere instalación de dependencias. Podés importar paquetes de npm directamente usando el prefijo `npm:`.

Agrega el access token de AfipSDK como variable de entorno desde el dashboard de Deno Deploy, en la sección **Settings > Environment Variables** de tu proyecto.

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En Deno Deploy, los paquetes npm se importan con el prefijo `npm:`.

{% tabs %}
{% tab title="main.ts" %}

```typescript
import Afip from 'npm:@afipsdk/afip.js';

const afip = new Afip({
  CUIT: 20409378472,
  access_token: Deno.env.get('AFIPSDK_ACCESS_TOKEN'),
});

Deno.serve(async (_req: Request) => {
  // Tu llamada de afipSDK aqui
});
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Para agregar las variables de ambiente primero debemos obtener el valor de .cert y .key en base64 (guardalo ya que se nos pedirá luego). En la consola ejecutaremos este comando para copiar el valor al portapapeles:

{% tabs %}
{% tab title="Git Bash" %}

```bash
base64 -w 0 afip-cert.crt | clip
base64 -w 0 afip-key.key | clip
```

{% endtab %}

{% tab title="Linux" %}

```bash
base64 -w 0 afip-cert.crt | xclip -selection clipboard
base64 -w 0 afip-key.key | xclip -selection clipboard
```

{% endtab %}
{% endtabs %}

El valor del certificado y la key deben almacenarse como **variables de entorno** del proyecto desde el dashboard de Deno Deploy, en la sección **Settings > Environment Variables**.

Y luego los leemos desde las variables de entorno en la función:

{% tabs %}
{% tab title="main.ts" %}
{% code fullWidth="true" %}

```typescript
import Afip from 'npm:@afipsdk/afip.js';

// Certificado y Key almacenados como variables de entorno
const afip = new Afip({
  cert: atob(Deno.env.get('AFIP_CERT')),
  key: atob(Deno.env.get('AFIP_KEY')),
  CUIT: 20111111112,
  access_token: Deno.env.get('AFIPSDK_ACCESS_TOKEN'), // Obtenido de https://app.afipsdk.com
});

```

{% endcode %}
{% endtab %}
{% endtabs %}


# AWS Lambda

Aprendé cómo usar Afip SDK con AWS Lambda.

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### Básicos

Para usar los Web Services de ARCA, vamos a utilizar la [API de Afip SDK](https://github.com/AfipSDK/afip-gitbook/blob/main/integracion/serverless/api.md).

En la [documentación de la API](https://github.com/AfipSDK/afip-gitbook/blob/main/integracion/serverless/api.md) podés consultar todos los parámetros del endpoint.

***

### 1. Instalación

Creá una nueva función Lambda desde la consola de AWS o con [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html), usando el runtime **Node.js**.

Agregá el access token de AfipSDK como variable de entorno de tu función Lambda desde la consola de AWS, en la sección **Configuration > Environment variables**.

### 2. Obtener el Ticket de Acceso (TA)

Antes de llamar a los Web Services de ARCA, necesitás un ticket de acceso (TA), también llamado Token Authorization.

Este TA expira tras un tiempo, pero no tenés que preocuparte por renovarlo: Afip SDK lo cachea y solicita uno nuevo automáticamente si es necesario. Solo llamá a la API y Afip SDK te devuelve el TA correspondiente.

Para obtener el TA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="index.mjs" %}

```javascript
const accessToken = process.env.AFIPSDK_ACCESS_TOKEN;

export const handler = async (event) => {
  const authResponse = await fetch('https://app.afipsdk.com/api/v1/afip/auth', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${accessToken}`,
    },
    body: JSON.stringify({
      environment: 'dev',
      tax_id: '20409378472', // CUIT a utilizar
      wsid: 'wsfe',
    }),
  });

  if (!authResponse.ok) {
    return {
      statusCode: authResponse.status,
      body: JSON.stringify({ error: `Error en la autorización: ${authResponse.status}` }),
    };
  }

  const { token, sign } = await authResponse.json();

  // Tu llamada al Web Service aqui
};
```

{% endtab %}
{% endtabs %}

`token` y `sign` corresponden el TA que nos da ARCA. Debemos enviar estos datos en el body de cada solicitud a los Web Services. En el manual de cada Web Service verás dónde colocarlos.

### 3. Llamar al método del Web Service que necesites

Con el TA ya podés realizar las llamadas a los Web Services que necesites.

Es similar al código para obtener el TA, pero debés cambiar la URL y el body de la request.

Podés encontrar las URLs y los body correspondientes en las pestañas API de la documentación de cada Web Service.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Para agregar las variables de ambiente primero debemos obtener el valor de .cert y .key en base64 (guardalo ya que se nos pedirá luego). En la consola ejecutaremos este comando para copiar el valor al portapapeles:

{% tabs %}
{% tab title="Git Bash" %}

```bash
base64 -w 0 afip-cert.crt | clip
base64 -w 0 afip-key.key | clip
```

{% endtab %}

{% tab title="Linux" %}

```bash
base64 -w 0 afip-cert.crt | xclip -selection clipboard
base64 -w 0 afip-key.key | xclip -selection clipboard
```

{% endtab %}
{% endtabs %}

El valor del certificado y la key deben almacenarse como **variables de entorno** de tu función Lambda desde la consola de AWS, en la sección **Configuration > Environment variables**.

Y luego los enviamos en el body de la llamada a la API:

{% tabs %}
{% tab title="index.mjs" %}
{% code fullWidth="true" %}

```javascript
const accessToken = process.env.AFIPSDK_ACCESS_TOKEN;
const cert = atob(process.env.AFIP_CERT);
const key = aatob(process.env.AFIP_KEY);

export const handler = async (event) => {
  const authResponse = await fetch('https://app.afipsdk.com/api/v1/afip/auth', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${accessToken}`,
    },
    body: JSON.stringify({
      environment: 'prod',
      tax_id: '20111111112', // CUIT del certificado
      wsid: 'wsfe',
      cert,
      key,
    }),
  });

  const { token, sign } = await authResponse.json();
};
```

{% endcode %}
{% endtab %}
{% endtabs %}


# AI Builders

Prompts por plataforma para integrar web services de ARCA con Afip SDK.

{% content-ref url="/pages/fg2lUWibBj1aGptsikrK" %}
[Lovable](/integracion/ai-builders/lovable)
{% endcontent-ref %}

{% content-ref url="/pages/7N6IWWEzoBWnaXfreFZJ" %}
[Replit](/integracion/ai-builders/replit)
{% endcontent-ref %}

{% content-ref url="/pages/MAMLntpfoWivANQJoZZ3" %}
[v0](/integracion/ai-builders/v0)
{% endcontent-ref %}

{% content-ref url="/pages/a1gMwdjMcVFiIyosDjx9" %}
[Bolt.new](/integracion/ai-builders/bolt-new)
{% endcontent-ref %}

{% content-ref url="/pages/SNepEB3SPiU292tQn3Ma" %}
[Anything](/integracion/ai-builders/anything)
{% endcontent-ref %}

{% content-ref url="/pages/0zx6roBC0Pu3jgMY7Rt8" %}
[Base44](/integracion/ai-builders/base44)
{% endcontent-ref %}


# Lovable

Aprendé cómo usar Afip SDK con Lovable para integrar web services de ARCA.

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)
* Tener un proyecto en Lovable
* Definir el CUIT que vas a usar
* Elegir el Web Service ID, por ejemplo `wsfe` para factura electrónica

### 1. Configuración

Lovable puede generar la pantalla y el backend desde un prompt, pero el access token de Afip SDK tiene que quedar guardado como secret del proyecto.

Agregá estas variables en la configuración de Lovable:

{% tabs %}
{% tab title="Secrets" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_TAX_ID=20409378472
AFIPSDK_WSID=wsfe
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
No uses el access token en componentes frontend, variables públicas, HTML o código visible desde el navegador.
{% endhint %}

### 2. Crear la integración en Lovable

Pedile a Lovable que cree una pantalla y una función backend para llamar a Afip SDK. La pantalla solo debe enviar los datos de la consulta a tu backend; el backend es el único lugar donde se lee `AFIPSDK_ACCESS_TOKEN`.

{% tabs %}
{% tab title="Prompt" %}

```
Integrá un web service de ARCA usando Afip SDK en esta app de Lovable.

Quiero una pantalla llamada "ARCA Web Service" con:
- Un formulario para ingresar CUIT sin guiones.
- Un selector de ambiente: dev o prod.
- Un campo para Web Service ID, por ejemplo wsfe.
- Un textarea para cargar el payload JSON del método del web service.
- Un botón para ejecutar la consulta.
- Estados visibles de loading, success y error.
- Un panel para mostrar el resultado JSON.

Backend:
- Creá una función backend o endpoint propio para toda la lógica de Afip SDK.
- Leé el token desde un secret llamado AFIPSDK_ACCESS_TOKEN.
- Si falta AFIPSDK_ACCESS_TOKEN, devolvé un error claro de configuración.
- Primero obtené el Ticket de Acceso llamando a POST https://app.afipsdk.com/api/v1/afip/auth.
- Enviá Authorization: Bearer TU_ACCESS_TOKEN.
- Enviá body JSON con environment, tax_id y wsid.
- Usá token y sign devueltos por Afip SDK para llamar al método del web service elegido.
- Devolvé al frontend solo el resultado final y errores claros.

Reglas:
- No hardcodees tokens, certificados ni keys.
- No uses secrets en componentes frontend.
- No inventes endpoints, campos ni estructuras de respuesta.
- Usá solo esta documentación:
  - https://docs.afipsdk.com/integracion/api
  - https://docs.afipsdk.com/siguientes-pasos/web-services/
  - https://docs.afipsdk.com/siguientes-pasos/web-services/otro-web-service
  - https://afipsdk.com/docs/api-reference/introduction/

Si falta información del método del web service, dejá un TODO claro indicando qué dato hay que completar según la documentación.
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con el backend creado ya podés realizar llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Lovable:

{% embed url="<https://afipsdk.com/blog/category/Lovable/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego pedile a Lovable que agregue `cert` y `key` solo en la función backend.

{% tabs %}
{% tab title="Prompt adicional" %}

```
Actualizá la función backend de Afip SDK para permitir usar certificado propio.

Reglas:
- El certificado y la key deben leerse desde secrets privados.
- Usá los nombres AFIPSDK_CERT y AFIPSDK_KEY.
- Nunca envíes cert, key ni AFIPSDK_ACCESS_TOKEN al frontend.
- Al llamar a POST /api/v1/afip/auth, agregá cert y key en el body junto con environment, tax_id y wsid.
```

{% endtab %}
{% endtabs %}


# Replit

Aprendé cómo usar Afip SDK con Replit para integrar web services de ARCA.

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)
* Tener un Repl creado
* Definir el CUIT que vas a usar
* Elegir el Web Service ID, por ejemplo `wsfe` para factura electrónica

### 1. Configuración

En Replit, guardá las credenciales en **Secrets**. El backend puede leerlas desde `process.env`, pero el frontend no debe recibirlas ni imprimirlas.

{% tabs %}
{% tab title="Secrets" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_TAX_ID=20409378472
AFIPSDK_WSID=wsfe
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
No escribas `AFIPSDK_ACCESS_TOKEN` en archivos del repo ni lo imprimas en logs. Guardalo en Replit Secrets.
{% endhint %}

### 2. Crear la integración en Replit

Pedile a Replit que use el stack actual del proyecto. Si no hay backend, conviene pedir uno simple con Node.js y Express para que la integración quede fácil de revisar.

{% tabs %}
{% tab title="Prompt" %}

```
Integrá un web service de ARCA usando Afip SDK en este proyecto de Replit.

Usá el stack actual del proyecto. Si no hay backend, creá uno simple con Node.js y Express.

Necesito:
- Un secret llamado AFIPSDK_ACCESS_TOKEN.
- Una variable opcional AFIPSDK_TAX_ID para el CUIT por defecto.
- Una variable opcional AFIPSDK_WSID para el Web Service ID por defecto.
- Un endpoint backend /api/afipsdk/web-service.
- Una UI simple para ejecutar la consulta y ver el resultado JSON.

Endpoint backend:
- Leer AFIPSDK_ACCESS_TOKEN desde process.env.
- Recibir environment, tax_id, wsid y payload desde el frontend.
- Validar que existan AFIPSDK_ACCESS_TOKEN, tax_id y wsid.
- Hacer POST https://app.afipsdk.com/api/v1/afip/auth.
- Enviar Authorization: Bearer TU_ACCESS_TOKEN.
- Enviar body JSON con environment, tax_id y wsid.
- Usar token y sign de la respuesta para llamar al método del web service elegido según la documentación oficial.
- Devolver al frontend el resultado final.
- Devolver errores claros si falta el token, falta CUIT, falta wsid o Afip SDK responde error.

Reglas:
- No pongas el token en archivos del repo.
- No expongas secrets al frontend.
- No imprimas AFIPSDK_ACCESS_TOKEN en logs.
- No inventes campos de Afip SDK.
- Usá esta documentación:
  - https://docs.afipsdk.com/integracion/api
  - https://docs.afipsdk.com/siguientes-pasos/web-services/
  - https://docs.afipsdk.com/siguientes-pasos/web-services/otro-web-service
  - https://afipsdk.com/docs/api-reference/introduction/
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con el endpoint creado ya podés realizar llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Replit:

{% embed url="<https://afipsdk.com/blog/category/Replit/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego agregá el certificado y la key como Secrets de Replit.

{% tabs %}
{% tab title="Secrets" %}

```bash
AFIPSDK_CERT=-----BEGIN CERTIFICATE-----...
AFIPSDK_KEY=-----BEGIN RSA PRIVATE KEY-----...
```

{% endtab %}

{% tab title="Prompt adicional" %}

```
Actualizá el endpoint /api/afipsdk/web-service para soportar certificado propio.

Reglas:
- Leer AFIPSDK_CERT y AFIPSDK_KEY desde process.env.
- No imprimir cert, key ni access token en logs.
- Al llamar a POST /api/v1/afip/auth, incluir cert y key en el body si existen.
- Mantener el frontend sin acceso a secrets.
```

{% endtab %}
{% endtabs %}


# v0

Aprendé cómo usar Afip SDK con v0 para integrar web services de ARCA.

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)
* Tener un proyecto Next.js generado con v0
* Definir el CUIT que vas a usar
* Elegir el Web Service ID, por ejemplo `wsfe` para factura electrónica

### 1. Configuración

v0 puede generar la UI y el código de Next.js. Para Afip SDK, la parte importante es que el access token quede en una variable de entorno privada y que la llamada se haga desde un Route Handler o Server Action.

{% tabs %}
{% tab title=".env.local" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_TAX_ID=20409378472
AFIPSDK_WSID=wsfe
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
No uses `NEXT_PUBLIC_` para el access token. Las variables con ese prefijo pueden quedar expuestas al navegador.
{% endhint %}

### 2. Crear la integración en v0

Pedile a v0 que genere una página y una ruta backend. El componente puede ser cliente para manejar el formulario, pero la llamada a Afip SDK debe vivir en `/api/afipsdk/web-service`.

{% tabs %}
{% tab title="Prompt" %}

```
Creá una app Next.js para integrar un web service de ARCA usando Afip SDK.

UI:
- Página simple con título "Consulta de Web Service ARCA".
- Formulario con CUIT, ambiente dev/prod y Web Service ID.
- Textarea para cargar el payload JSON del método que se va a ejecutar.
- Botón para ejecutar la consulta.
- Estados de loading, resultado y error.
- Validación visual si el JSON ingresado es inválido.

Backend:
- Crear un Route Handler en /api/afipsdk/web-service.
- El Route Handler debe leer process.env.AFIPSDK_ACCESS_TOKEN.
- No usar variables NEXT_PUBLIC_ para secrets.
- Primero llamar a POST https://app.afipsdk.com/api/v1/afip/auth.
- Enviar Authorization: Bearer TU_ACCESS_TOKEN.
- Enviar body JSON con environment, tax_id y wsid.
- Usar token y sign devueltos por Afip SDK para ejecutar el método del web service elegido según la documentación oficial.
- Devolver el resultado al frontend sin exponer AFIPSDK_ACCESS_TOKEN.

Variables de entorno:
- AFIPSDK_ACCESS_TOKEN: access token de Afip SDK.
- AFIPSDK_TAX_ID: CUIT por defecto, opcional.
- AFIPSDK_WSID: Web Service ID por defecto, opcional.

Reglas:
- No hardcodees credenciales.
- No expongas secrets al navegador.
- No inventes endpoints ni estructuras de respuesta.
- Usá la documentación oficial:
  - https://docs.afipsdk.com/integracion/api
  - https://docs.afipsdk.com/siguientes-pasos/web-services/
  - https://docs.afipsdk.com/siguientes-pasos/web-services/otro-web-service
  - https://afipsdk.com/docs/api-reference/introduction/
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con el Route Handler creado ya podés realizar llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para v0:

{% embed url="<https://afipsdk.com/blog/category/v0/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego agregá el certificado y la key como variables de entorno privadas.

{% tabs %}
{% tab title=".env.local" %}

```bash
AFIPSDK_CERT=-----BEGIN CERTIFICATE-----...
AFIPSDK_KEY=-----BEGIN RSA PRIVATE KEY-----...
```

{% endtab %}

{% tab title="Prompt adicional" %}

```
Actualizá el Route Handler /api/afipsdk/web-service para soportar certificado propio.

Reglas:
- Leer AFIPSDK_CERT y AFIPSDK_KEY desde variables de entorno privadas.
- No usar NEXT_PUBLIC_ para cert, key ni access token.
- Al llamar a POST /api/v1/afip/auth, incluir cert y key en el body si existen.
- Mantener el frontend sin acceso a secrets.
```

{% endtab %}
{% endtabs %}


# Bolt.new

Aprendé cómo usar Afip SDK con Bolt.new para integrar web services de ARCA.

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)
* Tener un proyecto creado en Bolt.new
* Definir el CUIT que vas a usar
* Elegir el Web Service ID, por ejemplo `wsfe` para factura electrónica

### 1. Configuración

En Bolt.new, primero pedí que detecte el stack del proyecto. Después indicá que la integración debe vivir en backend, server routes, API routes o serverless functions.

Configurá estas variables como secrets privados del proyecto:

{% tabs %}
{% tab title="Secrets" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_TAX_ID=20409378472
AFIPSDK_WSID=wsfe
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
Si el builder intenta llamar a Afip SDK directamente desde el frontend, pedile que mueva esa lógica a una ruta backend antes de seguir.
{% endhint %}

### 2. Crear la integración en Bolt.new

Usá este prompt para que Bolt.new detecte el stack y cree una ruta backend compatible con el proyecto.

{% tabs %}
{% tab title="Prompt" %}

```
Agregá una integración con un web service de ARCA usando Afip SDK a esta app de Bolt.new.

Primero detectá el stack del proyecto y explicá brevemente dónde vas a ubicar la ruta backend. Después implementá la integración siguiendo estas reglas:

Funcionalidad:
- Crear una pantalla mínima para probar el web service.
- La pantalla debe permitir configurar CUIT, ambiente dev/prod, Web Service ID y payload JSON.
- El frontend solo puede llamar a nuestro backend, nunca a Afip SDK directamente con el token.
- El backend debe leer AFIPSDK_ACCESS_TOKEN desde secrets o variables de entorno.
- Para obtener el Ticket de Acceso, llamar a POST https://app.afipsdk.com/api/v1/afip/auth.
- Enviar Authorization: Bearer TU_ACCESS_TOKEN.
- Enviar body JSON con environment, tax_id y wsid.
- Usar token y sign para llamar al método del web service elegido según la documentación oficial.
- Mostrar errores de configuración y errores de la API.

Reglas:
- No inventes endpoints, campos ni respuestas.
- No hardcodees credenciales.
- No imprimas AFIPSDK_ACCESS_TOKEN en logs.
- Usá la documentación oficial antes de escribir código:
  - https://docs.afipsdk.com/integracion/api
  - https://docs.afipsdk.com/siguientes-pasos/web-services/
  - https://docs.afipsdk.com/siguientes-pasos/web-services/otro-web-service
  - https://afipsdk.com/docs/api-reference/introduction/

Si el proyecto no tiene backend, creá una función serverless o route handler compatible con el framework actual.
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la ruta backend creada ya podés realizar llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Bolt.new:

{% embed url="<https://afipsdk.com/blog/category/Bolt.new/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego pedile a Bolt.new que lea el certificado y la key desde secrets privados.

{% tabs %}
{% tab title="Prompt adicional" %}

```
Actualizá la integración de Afip SDK para soportar certificado propio.

Reglas:
- Leer AFIPSDK_CERT y AFIPSDK_KEY desde secrets privados.
- No enviar cert, key ni AFIPSDK_ACCESS_TOKEN al frontend.
- Al llamar a POST /api/v1/afip/auth, incluir cert y key en el body si existen.
- Mantener la misma ruta backend que ya creaste para la integración.
```

{% endtab %}
{% endtabs %}


# Anything

Aprendé cómo usar Afip SDK con Anything para integrar web services de ARCA.

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)
* Tener un proyecto creado en Anything
* Definir el CUIT que vas a usar
* Elegir el Web Service ID, por ejemplo `wsfe` para factura electrónica

### 1. Configuración

En Anything, primero pedí que detecte el stack del proyecto. Después indicá que la integración debe vivir en backend, server routes, API routes o serverless functions.

Configurá estas variables como secrets privados del proyecto:

{% tabs %}
{% tab title="Secrets" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_TAX_ID=20409378472
AFIPSDK_WSID=wsfe
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
Si el builder intenta llamar a Afip SDK directamente desde el frontend, pedile que mueva esa lógica a una ruta backend antes de seguir.
{% endhint %}

### 2. Crear la integración en Anything

Usá este prompt para que Anything detecte el stack y cree una ruta backend compatible con el proyecto.

{% tabs %}
{% tab title="Prompt" %}

```
Agregá una integración con un web service de ARCA usando Afip SDK a esta app de Anything.

Primero detectá el stack del proyecto y explicá brevemente dónde vas a ubicar la ruta backend. Después implementá la integración siguiendo estas reglas:

Funcionalidad:
- Crear una pantalla mínima para probar el web service.
- La pantalla debe permitir configurar CUIT, ambiente dev/prod, Web Service ID y payload JSON.
- El frontend solo puede llamar a nuestro backend, nunca a Afip SDK directamente con el token.
- El backend debe leer AFIPSDK_ACCESS_TOKEN desde secrets o variables de entorno.
- Para obtener el Ticket de Acceso, llamar a POST https://app.afipsdk.com/api/v1/afip/auth.
- Enviar Authorization: Bearer TU_ACCESS_TOKEN.
- Enviar body JSON con environment, tax_id y wsid.
- Usar token y sign para llamar al método del web service elegido según la documentación oficial.
- Mostrar errores de configuración y errores de la API.

Reglas:
- No inventes endpoints, campos ni respuestas.
- No hardcodees credenciales.
- No imprimas AFIPSDK_ACCESS_TOKEN en logs.
- Usá la documentación oficial antes de escribir código:
  - https://docs.afipsdk.com/integracion/api
  - https://docs.afipsdk.com/siguientes-pasos/web-services/
  - https://docs.afipsdk.com/siguientes-pasos/web-services/otro-web-service
  - https://afipsdk.com/docs/api-reference/introduction/

Si el proyecto no tiene backend, creá una función serverless o route handler compatible con el framework actual.
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la ruta backend creada ya podés realizar llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Anything:

{% embed url="<https://afipsdk.com/blog/category/Anything/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego pedile a Anything que lea el certificado y la key desde secrets privados.

{% tabs %}
{% tab title="Prompt adicional" %}

```
Actualizá la integración de Afip SDK para soportar certificado propio.

Reglas:
- Leer AFIPSDK_CERT y AFIPSDK_KEY desde secrets privados.
- No enviar cert, key ni AFIPSDK_ACCESS_TOKEN al frontend.
- Al llamar a POST /api/v1/afip/auth, incluir cert y key en el body si existen.
- Mantener la misma ruta backend que ya creaste para la integración.
```

{% endtab %}
{% endtabs %}


# Base44

Aprendé cómo usar Afip SDK con Base44 para integrar web services de ARCA.

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)
* Tener un proyecto en Base44
* Definir el CUIT que vas a usar
* Elegir el Web Service ID, por ejemplo `wsfe` para factura electrónica

### 1. Configuración

Base44 puede generar la pantalla y el backend desde un prompt, pero el access token de Afip SDK tiene que quedar guardado como secret del proyecto.

Agregá estas variables en la configuración de Base44:

{% tabs %}
{% tab title="Secrets" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_TAX_ID=20409378472
AFIPSDK_WSID=wsfe
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
No uses el access token en componentes frontend, variables públicas, HTML o código visible desde el navegador.
{% endhint %}

### 2. Crear la integración en Base44

Pedile a Base44 que cree una pantalla y una función backend para llamar a Afip SDK. La pantalla solo debe enviar los datos de la consulta a tu backend; el backend es el único lugar donde se lee `AFIPSDK_ACCESS_TOKEN`.

{% tabs %}
{% tab title="Prompt" %}

```
Integrá un web service de ARCA usando Afip SDK en esta app de Base44.

Quiero una pantalla llamada "ARCA Web Service" con:
- Un formulario para ingresar CUIT sin guiones.
- Un selector de ambiente: dev o prod.
- Un campo para Web Service ID, por ejemplo wsfe.
- Un textarea para cargar el payload JSON del método del web service.
- Un botón para ejecutar la consulta.
- Estados visibles de loading, success y error.
- Un panel para mostrar el resultado JSON.

Backend:
- Creá una función backend o endpoint propio para toda la lógica de Afip SDK.
- Leé el token desde un secret llamado AFIPSDK_ACCESS_TOKEN.
- Si falta AFIPSDK_ACCESS_TOKEN, devolvé un error claro de configuración.
- Primero obtené el Ticket de Acceso llamando a POST https://app.afipsdk.com/api/v1/afip/auth.
- Enviá Authorization: Bearer TU_ACCESS_TOKEN.
- Enviá body JSON con environment, tax_id y wsid.
- Usá token y sign devueltos por Afip SDK para llamar al método del web service elegido.
- Devolvé al frontend solo el resultado final y errores claros.

Reglas:
- No hardcodees tokens, certificados ni keys.
- No uses secrets en componentes frontend.
- No inventes endpoints, campos ni estructuras de respuesta.
- Usá solo esta documentación:
  - https://docs.afipsdk.com/integracion/api
  - https://docs.afipsdk.com/siguientes-pasos/web-services/
  - https://docs.afipsdk.com/siguientes-pasos/web-services/otro-web-service
  - https://afipsdk.com/docs/api-reference/introduction/

Si falta información del método del web service, dejá un TODO claro indicando qué dato hay que completar según la documentación.
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con el backend creado ya podés realizar llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Base44:

{% embed url="<https://afipsdk.com/blog/category/Base44/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego pedile a Base44 que agregue `cert` y `key` solo en la función backend.

{% tabs %}
{% tab title="Prompt adicional" %}

```
Actualizá la función backend de Afip SDK para permitir usar certificado propio.

Reglas:
- El certificado y la key deben leerse desde secrets privados.
- Usá los nombres AFIPSDK_CERT y AFIPSDK_KEY.
- Nunca envíes cert, key ni AFIPSDK_ACCESS_TOKEN al frontend.
- Al llamar a POST /api/v1/afip/auth, agregá cert y key en el body junto con environment, tax_id y wsid.
```

{% endtab %}
{% endtabs %}


# PHP

Aprendé cómo usar Afip SDK con PHP

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá la librería de Afip SDK en PHP

{% tabs %}
{% tab title="composer" %}

```bash
composer require afipsdk/afip.php
```

{% endtab %}

{% tab title="Manualmente" %}
**Repositorio:** [**https://github.com/AfipSDK/afip.php**](https://github.com/AfipSDK/afip.php)

1. Clonarlo con `git clone` o descargar el repositorio desde [aqui](https://github.com/AfipSDK/afip.php/archive/refs/heads/master.zip).
2. Copiar el contenido de la carpeta `src` a tu aplicación.
3. Incluir el archivo Afip.php en tu proyecto (el resto de los archivos se incluyen automáticamente).\\

   ```php
   include 'ruta/a/src/Afip.php';
   ```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="index.php" %}

```php
$afip = new Afip([
    'CUIT' => 20409378472,
    'access_token' => 'TU_ACCESS_TOKEN' // Obtenido de https://app.afipsdk.com
]);
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También tenés un repositorio de ejemplo completo en PHP:

{% embed url="<https://github.com/AfipSDK/afip-sdk-billing-example-php>" %}

También podés usar las guías del blog de Afip SDK para PHP:

{% embed url="<https://afipsdk.com/blog/category/PHP/>" %}

### Integraciones por framework

Si estás trabajando con un framework PHP, podés seguir una guía específica para organizar la configuración, variables de entorno y servicios dentro de la estructura del proyecto.

{% content-ref url="/pages/Ej4Z0ggzkzZcAWoIbrR8" %}
[Laravel](/integracion/php/laravel)
{% endcontent-ref %}

{% content-ref url="/pages/wbfPTVT2ZSriUq0VTjxJ" %}
[Symfony](/integracion/php/symfony)
{% endcontent-ref %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title="index.php" %}

```php
// Certificado (Puede estar guardado en archivos, DB, etc)
$cert = file_get_contents('ruta/a/certificado.crt');

// Key (Puede estar guardado en archivos, DB, etc)
$key = file_get_contents('ruta/a/key.key');

// CUIT del certificado
$tax_id = 20111111112;

$afip = new Afip([
    'CUIT' => $tax_id,
    'cert' => $cert,
    'key' => $key,
    'access_token' => 'TU_ACCESS_TOKEN' // Obtenido de https://app.afipsdk.com
]);
```

{% endtab %}
{% endtabs %}


# Laravel

Aprendé cómo usar Afip SDK con Laravel

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá la librería de Afip SDK en Laravel.

{% tabs %}
{% tab title="composer" %}

```bash
composer require afipsdk/afip.php
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT en tu archivo de ambiente.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En Laravel podés crear un servicio para centralizar la instancia de Afip SDK y reutilizarlo desde controladores, jobs o comandos.

{% tabs %}
{% tab title="app/Services/AfipSdk.php" %}

```php
<?php

namespace App\Services;

use Afip;

class AfipSdk
{
    public function client(): Afip
    {
        return new Afip([
            'CUIT' => (int) env('AFIPSDK_CUIT', 20409378472),
            'access_token' => env('AFIPSDK_ACCESS_TOKEN') // Obtenido de https://app.afipsdk.com
        ]);
    }
}
```

{% endtab %}
{% endtabs %}

Después podés inyectar el servicio donde lo necesites.

{% tabs %}
{% tab title="app/Http/Controllers/ArcaController.php" %}

```php
<?php

namespace App\Http\Controllers;

use App\Services\AfipSdk;

class ArcaController extends Controller
{
    public function __invoke(AfipSdk $afipSdk)
    {
        $afip = $afipSdk->client();

        // Tu llamada de Afip SDK acá
    }
}
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para PHP:

{% embed url="<https://afipsdk.com/blog/category/PHP/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_CERT_PATH=/ruta/segura/certificado.crt
AFIPSDK_KEY_PATH=/ruta/segura/key.key
```

{% endtab %}

{% tab title="app/Services/AfipSdk.php" %}

```php
<?php

namespace App\Services;

use Afip;

class AfipSdk
{
    public function client(): Afip
    {
        return new Afip([
            'CUIT' => (int) env('AFIPSDK_CUIT', 20409378472),
            'cert' => file_get_contents(env('AFIPSDK_CERT_PATH')),
            'key' => file_get_contents(env('AFIPSDK_KEY_PATH')),
            'access_token' => env('AFIPSDK_ACCESS_TOKEN') // Obtenido de https://app.afipsdk.com
        ]);
    }
}
```

{% endtab %}
{% endtabs %}


# Symfony

Aprendé cómo usar Afip SDK con Symfony

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá la librería de Afip SDK en Symfony.

{% tabs %}
{% tab title="composer" %}

```bash
composer require afipsdk/afip.php
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT en tu archivo de ambiente.

{% tabs %}
{% tab title=".env.local" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En Symfony podés crear un servicio para centralizar la instancia de Afip SDK y reutilizarlo desde controladores, comandos o message handlers.

{% tabs %}
{% tab title="config/services.yaml" %}

```yaml
services:
    App\Service\AfipSdk:
        arguments:
            $cuit: '%env(int:AFIPSDK_CUIT)%'
            $accessToken: '%env(AFIPSDK_ACCESS_TOKEN)%'
```

{% endtab %}

{% tab title="src/Service/AfipSdk.php" %}

```php
<?php

namespace App\Service;

use Afip;

class AfipSdk
{
    public function __construct(
        private readonly int $cuit,
        private readonly string $accessToken,
    ) {
    }

    public function client(): Afip
    {
        return new Afip([
            'CUIT' => $this->cuit,
            'access_token' => $this->accessToken // Obtenido de https://app.afipsdk.com
        ]);
    }
}
```

{% endtab %}
{% endtabs %}

Después podés inyectar el servicio donde lo necesites.

{% tabs %}
{% tab title="src/Controller/ArcaController.php" %}

```php
<?php

namespace App\Controller;

use App\Service\AfipSdk;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Attribute\Route;

class ArcaController extends AbstractController
{
    #[Route('/arca')]
    public function __invoke(AfipSdk $afipSdk)
    {
        $afip = $afipSdk->client();

        // Tu llamada de Afip SDK acá
    }
}
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para PHP:

{% embed url="<https://afipsdk.com/blog/category/PHP/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title=".env.local" %}

```bash
AFIPSDK_CERT_PATH=/ruta/segura/certificado.crt
AFIPSDK_KEY_PATH=/ruta/segura/key.key
```

{% endtab %}

{% tab title="config/services.yaml" %}

```yaml
services:
    App\Service\AfipSdk:
        arguments:
            $cuit: '%env(int:AFIPSDK_CUIT)%'
            $accessToken: '%env(AFIPSDK_ACCESS_TOKEN)%'
            $certPath: '%env(AFIPSDK_CERT_PATH)%'
            $keyPath: '%env(AFIPSDK_KEY_PATH)%'
```

{% endtab %}

{% tab title="src/Service/AfipSdk.php" %}

```php
<?php

namespace App\Service;

use Afip;

class AfipSdk
{
    public function __construct(
        private readonly int $cuit,
        private readonly string $accessToken,
        private readonly string $certPath,
        private readonly string $keyPath,
    ) {
    }

    public function client(): Afip
    {
        return new Afip([
            'CUIT' => $this->cuit,
            'cert' => file_get_contents($this->certPath),
            'key' => file_get_contents($this->keyPath),
            'access_token' => $this->accessToken // Obtenido de https://app.afipsdk.com
        ]);
    }
}
```

{% endtab %}
{% endtabs %}


# Python

Aprendé cómo usar Afip SDK con Python

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá la librería de Afip SDK en Python

{% tabs %}
{% tab title="Pip" %}

```bash
pip install afip.py
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="index.py" %}

```python
from afip import Afip

afip = Afip({ 
    "CUIT": 20409378472,
    "access_token": "TU_ACCESS_TOKEN" # Obtenido de https://app.afipsdk.com
})
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Python:

{% embed url="<https://afipsdk.com/blog/category/Python/>" %}

Y un proyecto de ejemplo listo para usar:

{% embed url="<https://github.com/AfipSDK/afip-sdk-billing-example-python>" %}

### Integraciones por framework

Si estás trabajando con un framework Python, podés seguir una guía específica para organizar la configuración, variables de entorno y servicios dentro de la estructura del proyecto.

{% content-ref url="/pages/N3aIAhHcwBA8OsQNJns0" %}
[Flask](/integracion/python/flask)
{% endcontent-ref %}

{% content-ref url="/pages/maRy4OjRvPEcZ0lpgdcf" %}
[FastAPI](/integracion/python/fastapi)
{% endcontent-ref %}

{% content-ref url="/pages/QHkJ0qWT0NLQNl0soPIb" %}
[Django](/integracion/python/django)
{% endcontent-ref %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title="index.py" %}

```python
from afip import Afip

# Certificado (Puede estar guardado en archivos, DB, etc)
cert = open("ruta/a/certificado.crt").read()

# Key (Puede estar guardado en archivos, DB, etc)
key = open("ruta/a/key.key").read()

# CUIT del certificado
tax_id = 20111111112

afip = Afip({
    "CUIT": tax_id,
    "cert": cert,
    "key": key,
    "access_token": "TU_ACCESS_TOKEN" # Obtenido de https://app.afipsdk.com
))
```

{% endtab %}
{% endtabs %}


# Flask

Aprendé cómo usar Afip SDK con Flask

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá Flask, python-dotenv y la librería de Afip SDK en Python.

{% tabs %}
{% tab title="Pip" %}

```bash
pip install Flask python-dotenv afip.py
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT en tu archivo de ambiente.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En Flask podés crear una función para centralizar la instancia de Afip SDK y reutilizarla desde rutas, blueprints o tareas en segundo plano.

{% tabs %}
{% tab title="app/services/afip\_sdk.py" %}

```python
import os
from afip import Afip
from dotenv import load_dotenv


load_dotenv()


def get_afip_client():
    return Afip({
        "CUIT": int(os.getenv("AFIPSDK_CUIT", "20409378472")),
        "access_token": os.getenv("AFIPSDK_ACCESS_TOKEN") # Obtenido de https://app.afipsdk.com
    })
```

{% endtab %}
{% endtabs %}

Después podés usar el cliente donde lo necesites.

{% tabs %}
{% tab title="app/routes.py" %}

```python
from flask import Blueprint, jsonify
from app.services.afip_sdk import get_afip_client

arca = Blueprint("arca", __name__)


@arca.get("/arca")
def arca_handler():
    afip = get_afip_client()

    # Tu llamada de Afip SDK acá

    return jsonify({"ok": True})
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Python:

{% embed url="<https://afipsdk.com/blog/category/Python/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_CERT_PATH=/ruta/segura/certificado.crt
AFIPSDK_KEY_PATH=/ruta/segura/key.key
```

{% endtab %}

{% tab title="app/services/afip\_sdk.py" %}

```python
import os
from afip import Afip
from dotenv import load_dotenv


load_dotenv()


def get_afip_client():
    with open(os.getenv("AFIPSDK_CERT_PATH")) as cert_file:
        cert = cert_file.read()

    with open(os.getenv("AFIPSDK_KEY_PATH")) as key_file:
        key = key_file.read()

    return Afip({
        "CUIT": int(os.getenv("AFIPSDK_CUIT", "20409378472")),
        "cert": cert,
        "key": key,
        "access_token": os.getenv("AFIPSDK_ACCESS_TOKEN") # Obtenido de https://app.afipsdk.com
    })
```

{% endtab %}
{% endtabs %}


# FastAPI

Aprendé cómo usar Afip SDK con FastAPI

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá FastAPI, Uvicorn, python-dotenv y la librería de Afip SDK en Python.

{% tabs %}
{% tab title="Pip" %}

```bash
pip install fastapi uvicorn python-dotenv afip.py
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT en tu archivo de ambiente.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En FastAPI podés crear una dependencia para centralizar la instancia de Afip SDK y reutilizarla desde endpoints, routers o servicios.

{% tabs %}
{% tab title="app/services/afip\_sdk.py" %}

```python
import os
from afip import Afip
from dotenv import load_dotenv


load_dotenv()


def get_afip_client():
    return Afip({
        "CUIT": int(os.getenv("AFIPSDK_CUIT", "20409378472")),
        "access_token": os.getenv("AFIPSDK_ACCESS_TOKEN") # Obtenido de https://app.afipsdk.com
    })
```

{% endtab %}
{% endtabs %}

Después podés inyectar la dependencia donde lo necesites.

{% tabs %}
{% tab title="app/main.py" %}

```python
from fastapi import Depends, FastAPI
from afip import Afip
from app.services.afip_sdk import get_afip_client

app = FastAPI()


@app.get("/arca")
def arca_handler(afip: Afip = Depends(get_afip_client)):
    # Tu llamada de Afip SDK acá

    return {"ok": True}
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Python:

{% embed url="<https://afipsdk.com/blog/category/Python/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_CERT_PATH=/ruta/segura/certificado.crt
AFIPSDK_KEY_PATH=/ruta/segura/key.key
```

{% endtab %}

{% tab title="app/services/afip\_sdk.py" %}

```python
import os
from afip import Afip
from dotenv import load_dotenv


load_dotenv()


def get_afip_client():
    with open(os.getenv("AFIPSDK_CERT_PATH")) as cert_file:
        cert = cert_file.read()

    with open(os.getenv("AFIPSDK_KEY_PATH")) as key_file:
        key = key_file.read()

    return Afip({
        "CUIT": int(os.getenv("AFIPSDK_CUIT", "20409378472")),
        "cert": cert,
        "key": key,
        "access_token": os.getenv("AFIPSDK_ACCESS_TOKEN") # Obtenido de https://app.afipsdk.com
    })
```

{% endtab %}
{% endtabs %}


# Django

Aprendé cómo usar Afip SDK con Django

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá Django, python-dotenv y la librería de Afip SDK en Python.

{% tabs %}
{% tab title="Pip" %}

```bash
pip install Django python-dotenv afip.py
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT en tu archivo de ambiente.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

También podés mapear esas variables en tu configuración de Django.

{% tabs %}
{% tab title="settings.py" %}

```python
import os
from dotenv import load_dotenv


load_dotenv()

AFIPSDK_ACCESS_TOKEN = os.getenv("AFIPSDK_ACCESS_TOKEN")
AFIPSDK_CUIT = int(os.getenv("AFIPSDK_CUIT", "20409378472"))
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En Django podés crear un servicio para centralizar la instancia de Afip SDK y reutilizarlo desde views, management commands, tasks o signals.

{% tabs %}
{% tab title="arca/services/afip\_sdk.py" %}

```python
from afip import Afip
from django.conf import settings


def get_afip_client():
    return Afip({
        "CUIT": settings.AFIPSDK_CUIT,
        "access_token": settings.AFIPSDK_ACCESS_TOKEN # Obtenido de https://app.afipsdk.com
    })
```

{% endtab %}
{% endtabs %}

Después podés usar el servicio donde lo necesites.

{% tabs %}
{% tab title="arca/views.py" %}

```python
from django.http import JsonResponse
from arca.services.afip_sdk import get_afip_client


def arca_view(request):
    afip = get_afip_client()

    # Tu llamada de Afip SDK acá

    return JsonResponse({"ok": True})
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Python:

{% embed url="<https://afipsdk.com/blog/category/Python/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_CERT_PATH=/ruta/segura/certificado.crt
AFIPSDK_KEY_PATH=/ruta/segura/key.key
```

{% endtab %}

{% tab title="settings.py" %}

```python
import os

AFIPSDK_CERT_PATH = os.getenv("AFIPSDK_CERT_PATH")
AFIPSDK_KEY_PATH = os.getenv("AFIPSDK_KEY_PATH")
```

{% endtab %}

{% tab title="arca/services/afip\_sdk.py" %}

```python
from afip import Afip
from django.conf import settings


def get_afip_client():
    with open(settings.AFIPSDK_CERT_PATH) as cert_file:
        cert = cert_file.read()

    with open(settings.AFIPSDK_KEY_PATH) as key_file:
        key = key_file.read()

    return Afip({
        "CUIT": settings.AFIPSDK_CUIT,
        "cert": cert,
        "key": key,
        "access_token": settings.AFIPSDK_ACCESS_TOKEN # Obtenido de https://app.afipsdk.com
    })
```

{% endtab %}
{% endtabs %}


# Ruby

Aprendé cómo usar Afip SDK con Ruby

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá la librería de Afip SDK en Ruby

{% tabs %}
{% tab title="RubyGems" %}

```bash
gem install afip.rb
```

{% endtab %}

{% tab title="Gemfile" %}

```bash
gem 'afip.rb'
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="index.rb" %}

```ruby
require "afip"

afip = Afip.new({ 
    "CUIT": 20409378472,
    "access_token": "TU_ACCESS_TOKEN" # Obtenido de https://app.afipsdk.com
})
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Ruby:

{% embed url="<https://afipsdk.com/blog/category/Ruby/>" %}

### Integraciones por framework

Si estás trabajando con un framework Ruby, podés seguir una guía específica para organizar la configuración, variables de entorno y servicios dentro de la estructura del proyecto.

{% content-ref url="/pages/wRytWI5M9FFK6EPLMcQB" %}
[Rails](/integracion/ruby/rails)
{% endcontent-ref %}

{% content-ref url="/pages/3WsbcPT97MZ19UVhSxWY" %}
[Sinatra](/integracion/ruby/sinatra)
{% endcontent-ref %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title="index.rb" %}

```ruby
require "afip"

# Certificado (Puede estar guardado en archivos, DB, etc)
cert = File.read("ruta/a/certificado.crt")

# Key (Puede estar guardado en archivos, DB, etc)
key = File.read("ruta/a/key.key")

# CUIT del certificado
tax_id = 20111111112

afip = Afip.new({
    "CUIT": tax_id,
    "cert": cert,
    "key": key,
    "access_token": "TU_ACCESS_TOKEN" # Obtenido de https://app.afipsdk.com
})
```

{% endtab %}
{% endtabs %}


# Rails

Aprendé cómo usar Afip SDK con Rails

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá dotenv y la librería de Afip SDK en Rails.

{% tabs %}
{% tab title="Gemfile" %}

```ruby
gem "dotenv-rails", groups: [:development, :test]
gem "afip.rb"
```

{% endtab %}
{% endtabs %}

Instalá las dependencias.

{% tabs %}
{% tab title="Terminal" %}

```bash
bundle install
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT en tu archivo de ambiente.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En Rails podés crear un servicio para centralizar la instancia de Afip SDK y reutilizarlo desde controllers, jobs o rake tasks.

{% tabs %}
{% tab title="app/services/afip\_sdk.rb" %}

```ruby
require "afip"

class AfipSdk
  def self.client
    Afip.new({
      "CUIT": ENV.fetch("AFIPSDK_CUIT", "20409378472").to_i,
      "access_token": ENV.fetch("AFIPSDK_ACCESS_TOKEN") # Obtenido de https://app.afipsdk.com
    })
  end
end
```

{% endtab %}
{% endtabs %}

Después podés usar el servicio donde lo necesites.

{% tabs %}
{% tab title="app/controllers/arca\_controller.rb" %}

```ruby
class ArcaController < ApplicationController
  def show
    afip = AfipSdk.client

    # Tu llamada de Afip SDK acá

    render json: { ok: true }
  end
end
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Ruby:

{% embed url="<https://afipsdk.com/blog/category/Ruby/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_CERT_PATH=/ruta/segura/certificado.crt
AFIPSDK_KEY_PATH=/ruta/segura/key.key
```

{% endtab %}

{% tab title="app/services/afip\_sdk.rb" %}

```ruby
require "afip"

class AfipSdk
  def self.client
    Afip.new({
      "CUIT": ENV.fetch("AFIPSDK_CUIT", "20409378472").to_i,
      "cert": File.read(ENV.fetch("AFIPSDK_CERT_PATH")),
      "key": File.read(ENV.fetch("AFIPSDK_KEY_PATH")),
      "access_token": ENV.fetch("AFIPSDK_ACCESS_TOKEN") # Obtenido de https://app.afipsdk.com
    })
  end
end
```

{% endtab %}
{% endtabs %}


# Sinatra

Aprendé cómo usar Afip SDK con Sinatra

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá Sinatra, dotenv y la librería de Afip SDK en Ruby.

{% tabs %}
{% tab title="Gemfile" %}

```ruby
gem "sinatra"
gem "dotenv"
gem "afip.rb"
```

{% endtab %}
{% endtabs %}

Instalá las dependencias.

{% tabs %}
{% tab title="Terminal" %}

```bash
bundle install
```

{% endtab %}
{% endtabs %}

Agregá el access token y el CUIT en tu archivo de ambiente.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_ACCESS_TOKEN=TU_ACCESS_TOKEN
AFIPSDK_CUIT=20409378472
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

En Sinatra podés crear un helper para centralizar la instancia de Afip SDK y reutilizarlo desde rutas o servicios.

{% tabs %}
{% tab title="services/afip\_sdk.rb" %}

```ruby
require "afip"

module AfipSdk
  def self.client
    Afip.new({
      "CUIT": ENV.fetch("AFIPSDK_CUIT", "20409378472").to_i,
      "access_token": ENV.fetch("AFIPSDK_ACCESS_TOKEN") # Obtenido de https://app.afipsdk.com
    })
  end
end
```

{% endtab %}
{% endtabs %}

Después podés usar el cliente donde lo necesites.

{% tabs %}
{% tab title="app.rb" %}

```ruby
require "sinatra"
require "dotenv/load"
require "json"
require_relative "services/afip_sdk"

get "/arca" do
  afip = AfipSdk.client

  # Tu llamada de Afip SDK acá

  content_type :json
  { ok: true }.to_json
end
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Ruby:

{% embed url="<https://afipsdk.com/blog/category/Ruby/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title=".env" %}

```bash
AFIPSDK_CERT_PATH=/ruta/segura/certificado.crt
AFIPSDK_KEY_PATH=/ruta/segura/key.key
```

{% endtab %}

{% tab title="services/afip\_sdk.rb" %}

```ruby
require "afip"

module AfipSdk
  def self.client
    Afip.new({
      "CUIT": ENV.fetch("AFIPSDK_CUIT", "20409378472").to_i,
      "cert": File.read(ENV.fetch("AFIPSDK_CERT_PATH")),
      "key": File.read(ENV.fetch("AFIPSDK_KEY_PATH")),
      "access_token": ENV.fetch("AFIPSDK_ACCESS_TOKEN") # Obtenido de https://app.afipsdk.com
    })
  end
end
```

{% endtab %}
{% endtabs %}


# API

Aprendé cómo usar Afip SDK via API

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### Básicos

La URL base de la API es:

```url
https://app.afipsdk.com/api/
```

El body de las peticiones es de tipo JSON. Se debe agregar el header correspondiente:

```http
Content-Type: application/json
```

Además, debes agregar el header de autorización con tu access\_token

```http
Authorization: Bearer TU_ACCESS_TOKEN_AQUI
```

### 1. Obtener el Ticket de Acceso (TA)

Antes de llamar a los Web Services de ARCA, necesitás un ticket de acceso (TA), también llamado Token Authorization.

Este TA expira tras un tiempo, pero no tenés que preocuparte por renovarlo: Afip SDK lo cachea y solicita uno nuevo automáticamente si es necesario. Solo llamá a la API y Afip SDK te devuelve el TA correspondiente.

Para obtener el TA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/auth`

**Body**

<table><thead><tr><th width="146.5">Nombre</th><th width="96.5">Tipo</th><th>Descripción</th></tr></thead><tbody><tr><td><code>environment</code></td><td>string</td><td>Usar <code>dev</code> para ambiente de desarrollo o <code>prod</code> para producción.</td></tr><tr><td><code>tax_id</code></td><td>string</td><td>CUIT para el cual queremos obtener el TA.</td></tr><tr><td><code>wsid</code></td><td>string</td><td>ID del Web Service a utilizar. Lo encontrás al inicio de la documentación de Afip SDK de cada Web Service o en el manual PDF de ARCA.</td></tr><tr><td><code>force_create</code></td><td>boolean</td><td><code>default: false</code><br><br>Se debe setear en <code>true</code> si queremos forzar la creación de un nuevo TA.<br><br><a href="/pages/DexL0nExV0sSrFtkKL4C#forzar-la-solicitud-de-un-nuevo-ta">Mas información</a></td></tr><tr><td><code>cert</code></td><td>string</td><td>Certificado digital.</td></tr><tr><td><code>key</code></td><td>string</td><td>Key del certificado.</td></tr></tbody></table>

**Ejemplo**

```json
{
    "environment": "dev",
    "tax_id": "20409378472",
    "wsid": "wsfe"
}
```

**Response**

<mark style="color:green;">`STATUS`</mark> `200`

```json
{
    "expiration": "2024-03-13T00:42:59.845Z",
    "token": "PD94bWwgd...",
    "sign": "kEaCwSs36hpe..."
}
```

`token` y `sign` corresponden el TA que nos da ARCA. Debemos enviar estos datos en el body de cada solicitud a los Web Services. En el manual de cada Web Service verás dónde colocarlos.

### 2. Llamar al método del Web Service que necesites

Con el TA ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para API:

{% embed url="<https://afipsdk.com/blog/category/API/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Al pedir la autorización agregamos `cert` y `key` en el body

{% tabs %}
{% tab title="API Request" %} <mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/auth`

```json
{
    "environment": "dev",
    "tax_id": "20111111112",
    "wsid": "wsfe",
    "cert": "-----BEGIN CERTIFICATE-----MIIDRzC...",
    "key": "-----BEGIN RSA PRIVATE KEY-----MIIEowIBAAKCA..."
}
```

{% endtab %}
{% endtabs %}


# Visual Fox Pro

Aprendé cómo usar Afip SDK con Visual Fox Pro

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### Básicos

Para usar los Web Services de ARCA, vamos a utilizar la [API de Afip SDK](/integracion/api).

En la [documentación de la API](/integracion/api) podés consultar todos los parámetros del endpoint.

***

### 1. Instalación

Vamos a usar <https://github.com/AfipSDK/vfp-json/blob/master/json.prg> para trabajar con JSON.

{% tabs %}
{% tab title="AfipSDKRequest.prg" %}

```go
SET PROCEDURE TO "path\al\archivo\json.prg" ADDITIVE
```

{% endtab %}
{% endtabs %}

### 2. Obtener el Ticket de Acceso (TA)

Antes de llamar a los Web Services de ARCA, necesitás un ticket de acceso (TA), también llamado Token Authorization.

Este TA expira tras un tiempo, pero no tenés que preocuparte por renovarlo: Afip SDK lo cachea y solicita uno nuevo automáticamente si es necesario. Solo llamá a la API y Afip SDK te devuelve el TA correspondiente.

Para obtener el TA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="AfipSDKRequest.prg" %}

```go
LOCAL loHttp, loResponse, lcJson, lcAuthUrl, loAuthData, loAuthDataObject, loAuthResponse
loHttp = CREATEOBJECT("Msxml2.XMLHTTP")

lcAuthUrl = "https://app.afipsdk.com/api/v1/afip/auth"

loAuthDataObject = CREATEOBJECT("JSONObject")
loAuthDataObject.set("environment", "dev")
loAuthDataObject.set("tax_id", "20409378472")
loAuthDataObject.set("wsid", "wsfe")

loAuthData = json_encode(loAuthDataObject)

loHttp.Open("POST", lcAuthUrl, .F.)
loHttp.setRequestHeader("Content-Type", "application/json")

* Reemplazar con tu access_token obtenido de https://app.afipsdk.com
LOCAL accessToken
accessToken = "TU_TOKEN_AQUI"
loHttp.setRequestHeader("Authorization", "Bearer " + accessToken)

loHttp.Send(loAuthData)

IF loHttp.Status <> 200
    ? "Error en la autorizacion: " + STR(loHttp.Status)
    RETURN
ENDIF

loResponse = loHttp.responseText
loAuthResponse = json_decode(loResponse)

lcToken = loAuthResponse._token
lcSign = loAuthResponse._sign

? "Token: " + lcToken
? "Sign: " + lcSign

```

{% endtab %}
{% endtabs %}

`lcToken` y `lcSign` corresponden el TA que nos da ARCA. Debemos enviar estos datos en el body de cada solicitud a los Web Services. En el manual de cada Web Service verás dónde colocarlos.

### 3. Llamar al método del Web Service que necesites

Con el TA ya podés realizar las llamadas a los Web Services que necesites.

Es similar al código para obtener el TA, pero debés cambiar la URL y el body de la request.

Podés encontrar las URLs y los body correspondientes en las pestañas API de la documentación de cada Web Service.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Visual Fox Pro:

{% embed url="<https://afipsdk.com/blog/category/VFP/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Al pedir la autorización agregamos `cert` y `key` en el body

{% tabs %}
{% tab title="AfipSDKRequest.prg" %}

```go
loAuthDataObject.set("environment", "dev")
loAuthDataObject.set("tax_id", "20111111112")
loAuthDataObject.set("wsid", "wsfe")
loAuthDataObject.set("cert", "-----BEGIN CERTIFICATE-----MIIDRzC...")
loAuthDataObject.set("key", "-----BEGIN RSA PRIVATE KEY-----MIIEowIBAAKCA...")

```

{% endtab %}
{% endtabs %}


# Visual Basic 6

Aprendé cómo usar Afip SDK con Visual Basic 6

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### Básicos

Para usar los Web Services de ARCA, vamos a utilizar la [API de Afip SDK](/integracion/api).

En la [documentación de la API](/integracion/api) podés consultar todos los parámetros del endpoint.

***

### 1. Instalación

Vamos a usar <https://github.com/VBA-tools/VBA-JSON/blob/master/JsonConverter.bas> para trabajar con JSON.

Para esto debemos descargar [descargar JsonConverter.bas](https://raw.githubusercontent.com/VBA-tools/VBA-JSON/refs/heads/master/JsonConverter.bas), y agregarlo a nuestro proyecto.

<figure><img src="/files/GfQ38YWxetAtbO0oD800" alt="" width="173"><figcaption></figcaption></figure>

<figure><img src="/files/ycL5HoADQ3u3GvGm3Blt" alt="" width="375"><figcaption></figcaption></figure>

Y agregar las referencias "Microsoft Scripting Runtime" y "Microsoft WinHTTP Services, version 5.1"

<figure><img src="/files/BR2b1gTQ5YK9i8Tqz0L2" alt="" width="174"><figcaption></figcaption></figure>

<figure><img src="/files/783yr5UpVocSLqcZfPvs" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="/files/xLlnu159Le2CnbFQcuog" alt="" width="375"><figcaption></figcaption></figure>

### 2. Obtener el Ticket de Acceso (TA)

Antes de llamar a los Web Services de ARCA, necesitás un ticket de acceso (TA), también llamado Token Authorization.

Este TA expira tras un tiempo, pero no tenés que preocuparte por renovarlo: Afip SDK lo cachea y solicita uno nuevo automáticamente si es necesario. Solo llamá a la API y Afip SDK te devuelve el TA correspondiente.

Para obtener el TA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="AfipSDKRequest.frm" %}

```visual-basic
Private Sub GetAuthorization()
    Dim objHttp As Object
    Dim strResponse As String
    Dim strAuthUrl As String
    Dim strAuthData As String
    Dim dictAuthData As Dictionary
    
    ' Crear objeto XMLHTTP
    Set objHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
    
    strAuthUrl = "https://app.afipsdk.com/api/v1/afip/auth"
    
    ' Preparamos la data para pedir el TA
    Set dictAuthData = New Dictionary
    dictAuthData.Add "environment", "dev"
    dictAuthData.Add "tax_id", "20409378472"
    dictAuthData.Add "wsid", "wsfe"
    
    strAuthData = JsonConverter.ConvertToJson(dictAuthData)
    
    ' Reemplazar con tu access_token obtenido de https://app.afipsdk.com
    Dim accessToken As String
    accessToken = "TU_TOKEN_AQUI"

    With objHttp
        .Open "POST", strAuthUrl, False
        .setRequestHeader "Content-Type", "application/json"
        .setRequestHeader "Authorization", "Bearer " + accessToken
        .Send strAuthData
        
        If .Status <> 200 Then
            MsgBox "Error en la autorización: " & .Status
            MsgBox "Respuesta: " & .responseText
            Exit Sub
        End If
        
        strResponse = .responseText
    End With
    
    ' Parsear respuesta JSON (requiere función auxiliar ParseJson)
    Dim objJson As Object
    Set objJson = JsonConverter.ParseJson(strResponse)
    
    ' Guardar token y sign
    gstrToken = objJson("token")
    gstrSign = objJson("sign")
    
    Debug.Print "Token: " & gstrToken
    Debug.Print "Sign: " & gstrSign
End Sub

```

{% endtab %}
{% endtabs %}

`gstrToken` y `gstrSign` corresponden el TA que nos da ARCA. Debemos enviar estos datos en el body de cada solicitud a los Web Services. En el manual de cada Web Service verás dónde colocarlos.

### 3. Llamar al método del Web Service que necesites

Con el TA ya podés realizar las llamadas a los Web Services que necesites.

Es similar al código para obtener el TA, pero debés cambiar la URL y el body de la request.

Podés encontrar las URLs y los body correspondientes en las pestañas API de la documentación de cada Web Service.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Visual Basic 6:

{% embed url="<https://afipsdk.com/blog/category/VB6/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Al pedir la autorización agregamos `cert` y `key` en el body

{% tabs %}
{% tab title="AfipSDKRequest.frm" %}

```go
dictAuthData.Add "environment", "dev"
dictAuthData.Add "tax_id", "20111111112"
dictAuthData.Add "wsid", "wsfe"
dictAuthData.Add "cert", "-----BEGIN CERTIFICATE-----MIIDRzC..."
dictAuthData.Add "key", "-----BEGIN RSA PRIVATE KEY-----MIIEowIBAAKCA..."
```

{% endtab %}
{% endtabs %}


# .NET

Aprendé cómo usar Afip SDK con .NET

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá la librería de Afip SDK en .NET.

{% tabs %}
{% tab title=".NET CLI" %}

```bash
dotnet add package Afip.Net
```

{% endtab %}

{% tab title="PMC" %}

```bash
NuGet\Install-Package Afip.Net
```

{% endtab %}

{% tab title="PackageReference" %}

```xml
<PackageReference Include="Afip.Net" />
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="Program.cs" %}

```csharp
using AfipSDK.Afip.Net;

var afip = new Afip(new AfipOptions
{
    CUIT = "20409378472",
    Production = false,
    AccessToken = "TU_ACCESS_TOKEN", // Obtenido de https://app.afipsdk.com
});
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para .NET:

{% embed url="<https://afipsdk.com/blog/category/.NET/>" %}

Y un proyecto de ejemplo listo para usar:

{% embed url="<https://github.com/AfipSDK/afip-sdk-billing-example-dotnet>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title="Program.cs" %}
{% code fullWidth="true" %}

```csharp
using AfipSDK.Afip.Net;

var afip = new Afip(new AfipOptions
{
    CUIT = "20409378472",
    Production = false,
    AccessToken = "TU_ACCESS_TOKEN", // Obtenido de https://app.afipsdk.com
    Cert = "-----BEGIN CERTIFICATE-----MIIDRzC...",
    Key = "-----BEGIN RSA PRIVATE KEY-----MIIEowIBAAKCA..."
});
```

{% endcode %}
{% endtab %}
{% endtabs %}


# Java

Aprendé cómo usar Afip SDK con Java

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### 1. Instalación

Agregá la librería de Afip SDK en Java.

{% tabs %}
{% tab title="Maven" %}

```xml
<dependency>
    <groupId>com.afipsdk</groupId>
    <artifactId>afip-sdk-java</artifactId>
    <version>1.0.0</version>
</dependency>
```

{% endtab %}

{% tab title="Gradle" %}

```bash
implementation 'com.afipsdk:afip-sdk-java:1.0.0'
```

{% endtab %}
{% endtabs %}

### 2. Crear una instancia de la clase Afip

Para usar los Web Services de ARCA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="Main.java" %}

```java
import com.afipsdk.Afip;
import com.afipsdk.model.AfipOptions;

AfipOptions options = new AfipOptions();
options.setCuit("20409378472");
options.setProduction(false);
options.setAccessToken("TU_ACCESS_TOKEN"); // Obtenido de https://app.afipsdk.com

Afip afip = new Afip(options);
```

{% endtab %}
{% endtabs %}

### 3. Llamar al método del Web Service que necesites

Con la instancia creada ya podés realizar las llamadas a los Web Services que necesites.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Java:

{% embed url="<https://afipsdk.com/blog/category/Java/>" %}

Y un proyecto de ejemplo listo para usar:

{% embed url="<https://github.com/AfipSDK/afip-sdk-billing-example-java>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Y luego lo agregamos a la instancia de la clase Afip.

{% tabs %}
{% tab title="Main.java" %}
{% code fullWidth="true" %}

```java
import com.afipsdk.Afip;
import com.afipsdk.model.AfipOptions;

AfipOptions options = new AfipOptions();
options.setCuit("20111111112"); // CUIT del certificado
options.setProduction(false);
options.setAccessToken("TU_ACCESS_TOKEN"); // Obtenido de https://app.afipsdk.com
options.setCert("-----BEGIN CERTIFICATE-----MIIDRzC...");
options.setKey("-----BEGIN RSA PRIVATE KEY-----MIIEowIBAAKCA...");

Afip afip = new Afip(options);
```

{% endcode %}
{% endtab %}
{% endtabs %}


# Flutter

Aprendé cómo usar Afip SDK con Flutter

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### Básicos

Para usar los Web Services de ARCA, vamos a utilizar la [API de Afip SDK](/integracion/api).

En la [documentación de la API](/integracion/api) podés consultar todos los parámetros del endpoint.

***

### 1. Obtener el Ticket de Acceso (TA)

Antes de llamar a los Web Services de ARCA, necesitás un ticket de acceso (TA), también llamado Token Authorization.

Este TA expira tras un tiempo, pero no tenés que preocuparte por renovarlo: Afip SDK lo cachea y solicita uno nuevo automáticamente si es necesario. Solo llamá a la API y Afip SDK te devuelve el TA correspondiente.

Para obtener el TA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="AfipSDKRequest.dart" %}

```dart
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:intl/intl.dart';

var headers = { 'Content-Type': 'application/json' };

var request = http.Request('POST', Uri.parse('https://app.afipsdk.com/api/v1/afip/auth'));

request.body = json.encode({
    "environment": "dev",
    "tax_id": "20409378472", // CUIT a utilizar
    "wsid": "wsfe"
});

// Reemplazar con tu access_token obtenido de https://app.afipsdk.com
var accessToken = "TU_TOKEN_AQUI";
headers['Authorization'] = "Bearer " + accessToken; 

request.headers.addAll(headers);

http.StreamedResponse response = await request.send();

if (response.statusCode != 200) {
    print(await response.stream.bytesToString());

    throw new Error();
}

var auth = json.decode(await response.stream.bytesToString());

```

{% endtab %}
{% endtabs %}

`auth['token']` y `auth['sign']` corresponden el TA que nos da ARCA. Debemos enviar estos datos en el body de cada solicitud a los Web Services. En el manual de cada Web Service verás dónde colocarlos.

### 2. Llamar al método del Web Service que necesites

Con el TA ya podés realizar las llamadas a los Web Services que necesites.

Es similar al código para obtener el TA, pero debés cambiar la URL y el body de la request.

Podés encontrar las URLs y los body correspondientes en las pestañas API de la documentación de cada Web Service.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Flutter:

{% embed url="<https://afipsdk.com/blog/category/Flutter/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Al pedir la autorización agregamos `cert` y `key` en el body

{% tabs %}
{% tab title="AfipSDKRequest.dart" %}

```dart
request.body = json.encode({
    "environment": "dev",
    "tax_id": "20111111112", // CUIT del certificado
    "wsid": "wsfe",
    "cert": "-----BEGIN CERTIFICATE-----MIIDRzC...",
    "key": "-----BEGIN RSA PRIVATE KEY-----MIIEowIBAAKCA..."
});
```

{% endtab %}
{% endtabs %}


# Go

Aprendé cómo usar Afip SDK con Go

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### Básicos

Para usar los Web Services de ARCA, vamos a utilizar la [API de Afip SDK](/integracion/api).

En la [documentación de la API](/integracion/api) podés consultar todos los parámetros del endpoint.

***

### 1. Obtener el Ticket de Acceso (TA)

Antes de llamar a los Web Services de ARCA, necesitás un ticket de acceso (TA), también llamado Token Authorization.

Este TA expira tras un tiempo, pero no tenés que preocuparte por renovarlo: Afip SDK lo cachea y solicita uno nuevo automáticamente si es necesario. Solo llamá a la API y Afip SDK te devuelve el TA correspondiente.

Para obtener el TA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="AfipSDKRequest.go" %}

```go
import (
    "fmt"
    "strings"
    "net/http"
    "io/ioutil"
    "time"
)

url := "https://app.afipsdk.com/api/v1/afip/auth"
method := "POST"

authData, err := json.Marshal(map[string]string{
    "environment": "dev",
    "tax_id": "20409378472", // CUIT a utilizar
    "wsid": "wsfe",
})

payload := strings.NewReader(string(authData))

client := &http.Client {}

req, err := http.NewRequest(method, url, payload)

if err != nil {
    fmt.Println(err)
    return
}

// Reemplazar con tu access_token obtenido de https://app.afipsdk.com
accessToken := "TU_TOKEN_AQUI"
req.Header.Add("Authorization", "Bearer " + accessToken)

req.Header.Add("Content-Type", "application/json")

res, err := client.Do(req)

if err != nil {
    fmt.Println(err)
    return
}

defer res.Body.Close()

body, err := ioutil.ReadAll(res.Body)

if res.StatusCode >= 400 {
    fmt.Println(string(body))
    return
}

var auth any

json.Unmarshal([]byte(string(body)), &auth)

```

{% endtab %}
{% endtabs %}

`auth['token']` y `auth['sign']` corresponden el TA que nos da ARCA. Debemos enviar estos datos en el body de cada solicitud a los Web Services. En el manual de cada Web Service verás dónde colocarlos.

### 2. Llamar al método del Web Service que necesites

Con el TA ya podés realizar las llamadas a los Web Services que necesites.

Es similar al código para obtener el TA, pero debés cambiar la URL y el body de la request.

Podés encontrar las URLs y los body correspondientes en las pestañas API de la documentación de cada Web Service.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Go:

{% embed url="<https://afipsdk.com/blog/category/Go/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Al pedir la autorización agregamos `cert` y `key` en el body

{% tabs %}
{% tab title="AfipSDKRequest.go" %}

```go
authData, err := json.Marshal(map[string]string{
    "environment": "dev",
    "tax_id": "20111111112", // CUIT del certificado
    "wsid": "wsfe",
    "cert": "-----BEGIN CERTIFICATE-----MIIDRzC...",
    "key": "-----BEGIN RSA PRIVATE KEY-----MIIEowIBAAKCA..."
})
```

{% endtab %}
{% endtabs %}


# n8n

Aprendé cómo usar Afip SDK con n8n

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### Básicos

Para usar los Web Services de ARCA, vamos a utilizar la [API de Afip SDK](/integracion/api).

En la [documentación de la API](/integracion/api) podés consultar todos los parámetros del endpoint.

Para poder usar la API lo vamos a hacer a través del nodo **Execute web service request** de [AfipSDK](https://n8n.io/integrations/afip-sdk/).

<figure><img src="/files/KSLC7thP9fJBE8jivfuK" alt="" width="563"><figcaption></figcaption></figure>

***

### 1. Obtener el Ticket de Acceso (TA)

Antes de llamar a los Web Services de ARCA, necesitás un ticket de acceso (TA), también llamado Token Authorization.

Este TA expira tras un tiempo, pero no tenés que preocuparte por renovarlo: Afip SDK lo cachea y solicita uno nuevo automáticamente si es necesario. Solo llamá a la API y Afip SDK te devuelve el TA correspondiente.

Para obtener el TA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="Configurar credenciales" %}
Agrega el nodo **Get Authorization Token (TA)**, haz Click en "Set up credential" y escribe tu access token de AfipSDK en el campo "Bearer Token".

<figure><img src="/files/69ovqpEpFEVVG5AFHxTV" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/kaU5WeCU1ofEUPCcPvLp" alt="" width="400"><figcaption></figcaption></figure>

**Resultado**

<figure><img src="/files/bU5aHHYgowFcDs37Pjyn" alt=""><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

`token` y `sign` corresponden el TA que nos da ARCA. Debemos enviar estos datos en el body de cada solicitud a los Web Services. En el manual de cada Web Service verás dónde colocarlos.

### 2. Llamar al método del Web Service que necesites

Con el TA ya podés realizar las llamadas a los Web Services que necesites con el nodo **Execute web service request**.

<figure><img src="/files/3LF1gHsv6sdWwKmrCcIk" alt=""><figcaption></figcaption></figure>

Es similar al nodo para obtener el TA, pero debés cambiar los datos del body.

Podés ver los body correspondientes en las pestañas API de la documentación de cada Web Service.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para n8n:

{% embed url="<https://afipsdk.com/blog/category/n8n/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

En el nodo **Get authorization token (TA)** haz click en "Add Field" y agrega tu `cert` y `key`.

<figure><img src="/files/CuhSK4UxHFEGiJziSurR" alt="" width="400"><figcaption></figcaption></figure>


# Make

Aprendé cómo usar Afip SDK con Make

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### Básicos

Para usar los Web Services de ARCA, vamos a utilizar la [API de Afip SDK](/integracion/api).

En la [documentación de la API](/integracion/api) podés consultar todos los parámetros del endpoint.

Para poder usar la API lo vamos a hacer a través del nodo HTTP Request.

<figure><img src="/files/14CM2Dr8RETjgXVgRpFc" alt="" width="563"><figcaption></figcaption></figure>

***

### 1. Obtener el Ticket de Acceso (TA)

Antes de llamar a los Web Services de ARCA, necesitás un ticket de acceso (TA), también llamado Token Authorization.

Este TA expira tras un tiempo, pero no tenés que preocuparte por renovarlo: Afip SDK lo cachea y solicita uno nuevo automáticamente si es necesario. Solo llamá a la API y Afip SDK te devuelve el TA correspondiente.

Para obtener el TA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="HTTP Request" %}
Completamos con la siguiente información:

URL

```
https://app.afipsdk.com/api/v1/afip/auth
```

Method

```
POST
```

Headers

```http
Authorization: Bearer TU_TOKEN_AQUI
```

Body type

```
Raw
```

Content type

```
JSON(application/json)
```

Request content

```json
{
    "environment": "dev",
    "tax_id": "20409378472",
    "wsid": "wsfe"
}
```

Parse response

```
Yes
```

<figure><img src="/files/JE9mZQpUFpqkWtbtP7z4" alt=""><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

`token` y `sign` corresponden el TA que nos da ARCA. Debemos enviar estos datos en el body de cada solicitud a los Web Services. En el manual de cada Web Service verás dónde colocarlos.

### 2. Llamar al método del Web Service que necesites

Con el TA ya podés realizar las llamadas a los Web Services que necesites.

Es similar al código para obtener el TA, pero debés cambiar la URL y el body de la request.

Podés encontrar las URLs y los body correspondientes en las pestañas API de la documentación de cada Web Service.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Make:

{% embed url="<https://afipsdk.com/blog/category/Make/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Al pedir la autorización agregamos `cert` y `key` en el Request content

{% tabs %}
{% tab title="HTTP Request" %}
Request content

```json
{
    "environment": "dev",
    "tax_id": "20111111112",
    "wsid": "wsfe",
    "cert": "-----BEGIN CERTIFICATE-----MIIDRzC...",
    "key": "-----BEGIN RSA PRIVATE KEY-----MIIEowIBAAKCA..."
}
```

<figure><img src="/files/Bzghz81jh5W68DugTyBn" alt="" width="375"><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}


# Bubble

Aprendé cómo usar Afip SDK con Bubble

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### Básicos

Para usar los Web Services de ARCA, vamos a utilizar la [API de Afip SDK](/integracion/api).

En la [documentación de la API](/integracion/api) podés consultar todos los parámetros del endpoint.

Para poder usar la API lo vamos a hacer a través del plugin API Connector.

En el menu izquierdo clickeamos en el icono de plugins

<figure><img src="/files/Est99esl9HnT1LsM8nFU" alt="" width="100"><figcaption></figcaption></figure>

Clickeamos en "+ Add Plugins"

<figure><img src="/files/vNiewCbtlb0bEf5Up8bB" alt="" width="214"><figcaption></figcaption></figure>

Buscamos "API Connector" y le damos a "Install"

<figure><img src="/files/iD8WNkI5Kq5LyTpb8Qse" alt="" width="563"><figcaption></figcaption></figure>

Clickeamos en "+ Add another API"

<figure><img src="/files/XpHtozJ7vCHtlArIBriW" alt="" width="211"><figcaption></figcaption></figure>

En API Name ponemos "Afip SDK"

<figure><img src="/files/64RnSUChfZHwNe3nbUnW" alt="" width="375"><figcaption></figcaption></figure>

***

### 1. Obtener el Ticket de Acceso (TA)

Antes de llamar a los Web Services de ARCA, necesitás un ticket de acceso (TA), también llamado Token Authorization.

Este TA expira tras un tiempo, pero no tenés que preocuparte por renovarlo: Afip SDK lo cachea y solicita uno nuevo automáticamente si es necesario. Solo llamá a la API y Afip SDK te devuelve el TA correspondiente.

Para obtener el TA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="API Call" %}
En el recuadro de API Call, en la esquina superior derecha, le damos a expand

<figure><img src="/files/OP8hdKnwBe27ovfAaENW" alt=""><figcaption></figcaption></figure>

Completamos con la siguiente información:

Name

```
Auth Create
```

Use as

```
Action
```

Headers

```http
Authorization: Bearer TU_TOKEN_AQUI
```

Data type

```
JSON
```

```
POST https://app.afipsdk.com/api/v1/afip/auth
```

Body

```json
{
    "environment": "dev",
    "tax_id": "20409378472",
    "wsid": "wsfe"
}
```

<figure><img src="/files/7FljCkD82erIjg7G9H4w" alt="" width="563"><figcaption></figcaption></figure>

Clickeamos en "Initialize Call"

<figure><img src="/files/ajZpfEAJkoSxCN5hoV0r" alt="" width="563"><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

`token` y `sign` corresponden el TA que nos da ARCA. Debemos enviar estos datos en el body de cada solicitud a los Web Services. En el manual de cada Web Service verás dónde colocarlos.

### 2. Llamar al método del Web Service que necesites

Con el TA ya podés realizar las llamadas a los Web Services que necesites.

Es similar al código para obtener el TA, pero debés cambiar la URL y el body de la request.

Podés encontrar las URLs y los body correspondientes en las pestañas API de la documentación de cada Web Service.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para Bubble:

{% embed url="<https://afipsdk.com/blog/category/Bubble/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Al pedir la autorización agregamos `cert` y `key` en el Body

{% tabs %}
{% tab title="API Call" %}
Body

```json
{
    "environment": "dev",
    "tax_id": "20111111112",
    "wsid": "wsfe",
    "cert": "-----BEGIN CERTIFICATE-----MIIDRzC...",
    "key": "-----BEGIN RSA PRIVATE KEY-----MIIEowIBAAKCA..."
}
```

<figure><img src="/files/enCwgFZpmrk9lOD4EEW5" alt="" width="563"><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}


# Zapier

Aprendé cómo usar Afip SDK con n8n

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### Básicos

Para usar los Web Services de ARCA, vamos a utilizar la [API de Afip SDK](/integracion/api).

En la [documentación de la API](/integracion/api) podés consultar todos los parámetros del endpoint.

Para poder usar la API lo vamos a hacer a través de la action Webhooks

<figure><img src="/files/vBAvWsdTajLVxQsIBOcz" alt="" width="563"><figcaption></figcaption></figure>

***

### 1. Obtener el Ticket de Acceso (TA)

Antes de llamar a los Web Services de ARCA, necesitás un ticket de acceso (TA), también llamado Token Authorization.

Este TA expira tras un tiempo, pero no tenés que preocuparte por renovarlo: Afip SDK lo cachea y solicita uno nuevo automáticamente si es necesario. Solo llamá a la API y Afip SDK te devuelve el TA correspondiente.

Para obtener el TA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="Webhooks" %}
En Action Event elegimos custom request

<figure><img src="/files/ZTuQ4umCBbzsAFQ46WyS" alt="" width="161"><figcaption></figcaption></figure>

Completamos con la siguiente información:

Method

```
POST
```

URL

```
https://app.afipsdk.com/api/v1/afip/auth
```

Data Pass-Through?

```
False
```

Data

```json
{
    "environment": "dev",
    "tax_id": "20409378472",
    "wsid": "wsfe"
}
```

Unflatten

```
Yes
```

Headers

```http
Content-Type: application/json
```

```http
Authorization: Bearer TU_TOKEN_AQUI
```

Return Raw Response

```
No
```

<figure><img src="/files/ntfusyQA6gmuJtYLm0LB" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/dieGvE1JaxlQR8yuVNgq" alt="" width="563"><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

`token` y `sign` corresponden el TA que nos da ARCA. Debemos enviar estos datos en el body de cada solicitud a los Web Services. En el manual de cada Web Service verás dónde colocarlos.

### 2. Llamar al método del Web Service que necesites

Con el TA ya podés realizar las llamadas a los Web Services que necesites.

Es similar al código para obtener el TA, pero debés cambiar la URL y el body de la request.

Podés encontrar las URLs y los body correspondientes en las pestañas API de la documentación de cada Web Service.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para API:

{% embed url="<https://afipsdk.com/blog/category/API/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Al pedir la autorización agregamos `cert` y `key` en Data

{% tabs %}
{% tab title="Webhooks" %}
Data

```json
{
    "environment": "dev",
    "tax_id": "20111111112",
    "wsid": "wsfe",
    "cert": "-----BEGIN CERTIFICATE-----MIIDRzC...",
    "key": "-----BEGIN RSA PRIVATE KEY-----MIIEowIBAAKCA..."
}
```

<figure><img src="/files/fGsDVWcI00cQeClv43U9" alt="" width="563"><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}


# Pipedream

Aprendé cómo usar Afip SDK con Pipedream

### Requisitos previos

Para poder seguir esta guía, primero necesitarás:

* [Obtener un access\_token de Afip SDK](https://app.afipsdk.com)

### Básicos

Para usar los Web Services de ARCA, vamos a utilizar la [API de Afip SDK](/integracion/api).

En la [documentación de la API](/integracion/api) podés consultar todos los parámetros del endpoint.

Para poder usar la API lo vamos a hacer a través de la action HTTP Request

<figure><img src="/files/mRBOn9Jp1TSOMtcMFHhZ" alt="" width="563"><figcaption></figcaption></figure>

***

### 1. Obtener el Ticket de Acceso (TA)

Antes de llamar a los Web Services de ARCA, necesitás un ticket de acceso (TA), también llamado Token Authorization.

Este TA expira tras un tiempo, pero no tenés que preocuparte por renovarlo: Afip SDK lo cachea y solicita uno nuevo automáticamente si es necesario. Solo llamá a la API y Afip SDK te devuelve el TA correspondiente.

Para obtener el TA se necesita un certificado digital, pero con Afip SDK podés empezar en modo desarrollo usando el CUIT 20-40937847-2 sin necesidad de uno.

Si preferís [usar tu propio certificado](#usar-tu-propio-certificado-opcional), al final te mostramos cómo.

{% tabs %}
{% tab title="Http Request" %}
Completamos con la siguiente información:

Method

```
POST
```

URL

```
https://app.afipsdk.com/api/v1/afip/auth
```

**En la pestaña Headers**

```http
Authorization: Bearer TU_TOKEN_AQUI
```

**En la pestaña Body:**

Content-Type:

```
application/json
```

Raw Request Body

```json
{
    "environment": "dev",
    "tax_id": "20409378472",
    "wsid": "wsfe"
}
```

<figure><img src="/files/4YF8idVmcKh5QatsPdQA" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/DBmrvZwkXn80JDCpLlYS" alt="" width="563"><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

`token` y `sign` corresponden el TA que nos da ARCA. Debemos enviar estos datos en el body de cada solicitud a los Web Services. En el manual de cada Web Service verás dónde colocarlos.

### 2. Llamar al método del Web Service que necesites

Con el TA ya podés realizar las llamadas a los Web Services que necesites.

Es similar al código para obtener el TA, pero debés cambiar la URL y el body de la request.

Podés encontrar las URLs y los body correspondientes en las pestañas API de la documentación de cada Web Service.

{% content-ref url="/pages/mVTz5YrKc8PCEeJKHt0W" %}
[Web services](/siguientes-pasos/web-services)
{% endcontent-ref %}

Si el Web Service que necesitás no se encuentra en la lista de la documentación, podés llamarlo siguiendo esta guía:

{% content-ref url="/pages/4zlCsTNGo99FZGfrhpZn" %}
[Otro web service](/siguientes-pasos/web-services/otro-web-service)
{% endcontent-ref %}

Podés usar la referencia de la API para obtener ejemplos de cómo usar los métodos de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

También podés usar las guías del blog de Afip SDK para API:

{% embed url="<https://afipsdk.com/blog/category/API/>" %}

***

### Usar tu propio certificado <sup><sub>(Opcional)<sub></sup>

Primero, obtenemos el certificado siguiendo esta guía.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" fullWidth="false" %}

Al pedir la autorización agregamos `cert` y `key` en Data

{% tabs %}
{% tab title="Http Request" %}
Data

```json
{
    "environment": "dev",
    "tax_id": "20111111112",
    "wsid": "wsfe",
    "cert": "-----BEGIN CERTIFICATE-----MIIDRzC...",
    "key": "-----BEGIN RSA PRIVATE KEY-----MIIEowIBAAKCA..."
}
```

<figure><img src="/files/x1YmfuJGsM6PEFiatZpn" alt="" width="563"><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}


# Web services

Antes de comenzar a usar cualquier web service, recordá autorizarlo en ARCA. Cada web service requiere su propia autorización. En la siguiente guía se explica cómo hacerlo:

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" %}


# Factura electrónica

### Requisitos previos

Para poder usar esta guía, primero necesitarás:

* [Integrar Afip SDK en tu proyecto](/#integracion)

***

La especificación de este Web Service se encuentra disponible en <https://www.afip.gob.ar/ws/documentacion/manuales/manual-desarrollador-ARCA-COMPG-v4-0.pdf>

<details>

<summary>Identificador <kbd>wsfe</kbd></summary>

Producción <img src="/files/N4QM8iTXaXtQ66Xj8Gs5" alt="Produccion" data-size="line">

Desarrollo <img src="/files/SkkUxkZmP1C06dac8VG5" alt="Desarrollo" data-size="original">

</details>

{% hint style="info" %}
Aquí hablaremos de comprobante indistintamente si es una factura, nota de crédito, etc.
{% endhint %}

*Si es tu primera vez conectándote con la facturación electrónica de AFIP/ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general:*

{% embed url="<https://afipsdk.com/blog/conectar-tu-sistema-con-la-facturacion-electronica-de-afip/>" fullWidth="false" %}

***

### Crear PDF

{% content-ref url="/pages/ffTzRIgExZ712TAX7yJx" %}
[Crear PDF](/siguientes-pasos/web-services/factura-electronica/crear-pdf)
{% endcontent-ref %}

### **Obtener número del último comprobante creado**

{% tabs %}
{% tab title="Node" %}

<pre class="language-javascript"><code class="lang-javascript"><strong>// Numero de punto de venta
</strong>const puntoDeVenta = 1;

// Tipo de comprobante
const tipoDeComprobante = 6; // 6 = Factura B

const lastVoucher = await afip.ElectronicBilling.getLastVoucher(puntoDeVenta, tipoDeComprobante);
</code></pre>

{% endtab %}

{% tab title="PHP" %}

```php
// Numero de punto de venta
$punto_de_venta = 1;

// Tipo de comprobante
$tipo_de_comprobante = 6; // 6 = Factura B

$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_comprobante);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# Numero de punto de venta
punto_de_venta = 1

# Tipo de comprobante
tipo_de_comprobante = 6 # 6 = Factura B

last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_comprobante)
```

{% endtab %}

{% tab title="Python" %}

```python
# Numero de punto de venta
punto_de_venta = 1

# Tipo de comprobante
tipo_de_comprobante = 6 # 6 = Factura B

last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_comprobante)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Punto de venta
int puntoDeVenta = 1;

// Tipo de comprobante
int tipoDeFactura = 6; // 6 = Factura B

var lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(puntoDeVenta, tipoDeFactura);
```

{% endtab %}

{% tab title="Java" %}

```java
// Punto de venta
int puntoDeVenta = 1;

// Tipo de comprobante
int tipoDeFactura = 6; // 6 = Factura B

int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeFactura);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECompUltimoAutorizado",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "PtoVta" : 1,
        "CbteTipo" : 6
    }
}
```

{% endtab %}
{% endtabs %}

### **Crear y asignar CAE a un comprobante**

{% tabs %}
{% tab title="Node" %}
Debemos utilizar el método `createVoucher` pasándole como parámetro un Objeto con los detalles del comprobante y si queremos tener la respuesta completa enviada por el WS debemos pasarle como segundo parámetro `true`, en caso de no enviarle el segundo parámetro nos devolverá como respuesta `{ CAE : CAE asignado el comprobante, CAEFchVto : Fecha de vencimiento del CAE (yyyy-mm-dd) }`.

```js
// Devolver respuesta completa del web service
const returnFullResponse = false;

const date = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

// Info del comprobante
let data = {
	'CantReg' 	: 1,  // Cantidad de comprobantes a registrar
	'PtoVta' 	: 1,  // Punto de venta
	'CbteTipo' 	: 6,  // Tipo de comprobante (ver tipos disponibles) 
	'Concepto' 	: 1,  // Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
	'DocTipo' 	: 99, // Tipo de documento del comprador (99 consumidor final, ver tipos disponibles)
	'DocNro' 	: 0,  // Número de documento del comprador (0 consumidor final)
	'CbteDesde' 	: 1,  // Número de comprobante o numero del primer comprobante en caso de ser mas de uno
	'CbteHasta' 	: 1,  // Número de comprobante o numero del último comprobante en caso de ser mas de uno
	'CbteFch' 	: parseInt(date.replace(/-/g, '')), // (Opcional) Fecha del comprobante (yyyymmdd) o fecha actual si es nulo
	'ImpTotal' 	: 121, // Importe total del comprobante
	'ImpTotConc' 	: 0,   // Importe neto no gravado
	'ImpNeto' 	: 100, // Importe neto gravado
	'ImpOpEx' 	: 0,   // Importe exento de IVA
	'ImpIVA' 	: 21,  //Importe total de IVA
	'ImpTrib' 	: 0,   //Importe total de tributos
	'MonId' 	: 'PES', //Tipo de moneda usada en el comprobante (ver tipos disponibles)('PES' para pesos argentinos)
	'CondicionIVAReceptorId' : 5, // Condición frente al IVA del receptor  
	'MonCotiz' 	: 1,     // Cotización de la moneda usada (1 para pesos argentinos)  
	'Iva' 		: [ // (Opcional) Alícuotas asociadas al comprobante
		{
			'Id' 		: 5, // Id del tipo de IVA (5 para 21%)(ver tipos disponibles) 
			'BaseImp' 	: 100, // Base imponible
			'Importe' 	: 21 // Importe 
		}
	],
};

const res = await afip.ElectronicBilling.createVoucher(data, returnFullResponse);

res['CAE']; //CAE asignado el comprobante
res['CAEFchVto']; //Fecha de vencimiento del CAE (yyyy-mm-dd)
```

{% hint style="info" %}
Este método acepta mas parámetros, podes encontrar todos los parámetros disponibles [En este ejemplo](https://github.com/AfipSDK/afip.js/blob/master/examples/createVoucher.js)
{% endhint %}
{% endtab %}

{% tab title="PHP" %}
Debemos utilizar el método `CreateVoucher` pasándole como parámetro un Array con los detalles del comprobante y si queremos tener la respuesta completa devuelta por el WS debemos pasarle como segundo parámetro TRUE, en caso de no enviarle el segundo parámetro nos devolverá como respuesta `array(CAE => CAE asignado el comprobante, CAEFchVto => Fecha de vencimiento del CAE (yyyy-mm-dd))`.

```php
// Devolver respuesta completa del web service
$return_full_response = FALSE;

// Info del comprobante
$data = array(
	'CantReg' 	=> 1,  // Cantidad de comprobantes a registrar
	'PtoVta' 	=> 1,  // Punto de venta
	'CbteTipo' 	=> 6,  // Tipo de comprobante (ver tipos disponibles) 
	'Concepto' 	=> 1,  // Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
	'DocTipo' 	=> 99, // Tipo de documento del comprador (99 consumidor final, ver tipos disponibles)
	'DocNro' 	=> 0,  // Número de documento del comprador (0 consumidor final)
	'CbteDesde' 	=> 1,  // Número de comprobante o numero del primer comprobante en caso de ser mas de uno
	'CbteHasta' 	=> 1,  // Número de comprobante o numero del último comprobante en caso de ser mas de uno
	'CbteFch' 	=> intval(date('Ymd')), // (Opcional) Fecha del comprobante (yyyymmdd) o fecha actual si es nulo
	'ImpTotal' 	=> 121, // Importe total del comprobante
	'ImpTotConc' 	=> 0,   // Importe neto no gravado
	'ImpNeto' 	=> 100, // Importe neto gravado
	'ImpOpEx' 	=> 0,   // Importe exento de IVA
	'ImpIVA' 	=> 21,  //Importe total de IVA
	'ImpTrib' 	=> 0,   //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en el comprobante (ver tipos disponibles)('PES' para pesos argentinos) 
	'MonCotiz' 	=> 1,     // Cotización de la moneda usada (1 para pesos argentinos)  
	'CondicionIVAReceptorId' => 5, // Condición frente al IVA del receptor  
	'Iva' 		=> array( // (Opcional) Alícuotas asociadas al comprobante
		array(
			'Id' 		=> 5, // Id del tipo de IVA (5 para 21%)(ver tipos disponibles) 
			'BaseImp' 	=> 100, // Base imponible
			'Importe' 	=> 21 // Importe 
		)
	), 
);

$res = $afip->ElectronicBilling->CreateVoucher($data, $return_full_response);

$res['CAE']; //CAE asignado el comprobante
$res['CAEFchVto']; //Fecha de vencimiento del CAE (yyyy-mm-dd)
```

{% hint style="info" %}
Este método acepta mas parámetros, podes encontrar todos los parámetros disponibles [En este ejemplo](https://github.com/AfipSDK/afip.php/blob/master/examples/CreateVoucher.php)
{% endhint %}
{% endtab %}

{% tab title="Ruby" %}
Debemos utilizar el método `createVoucher` pasándole como parámetro un Hash con los detalles del comprobante y si queremos tener la respuesta completa devuelta por el WS debemos pasarle como segundo parámetro true, en caso de no enviarle el segundo parámetro nos devolverá como respuesta `{ "CAE": CAE asignado el comprobante, "CAEFchVto" : Fecha de vencimiento del CAE (yyyy-mm-dd) }`.

```ruby
# Devolver respuesta completa del web service
return_full_response = FALSE

# Info del comprobante
data = {
  "CantReg": 1,  # Cantidad de comprobantes a registrar
  "PtoVta": 1,  # Punto de venta
  "CbteTipo": 6,  # Tipo de comprobante (ver tipos disponibles) 
  "Concepto": 1,  # Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
  "DocTipo": 99, # Tipo de documento del comprador (99 consumidor final, ver tipos disponibles)
  "DocNro": 0,  # Número de documento del comprador (0 consumidor final)
  "CbteDesde": 1,  # Número de comprobante o numero del primer comprobante en caso de ser mas de uno
  "CbteHasta": 1,  # Número de comprobante o numero del último comprobante en caso de ser mas de uno
  "CbteFch": 20231220, # (Opcional) Fecha del comprobante (yyyymmdd) o fecha actual si es nulo
  "ImpTotal": 121, # Importe total del comprobante
  "ImpTotConc": 0,   # Importe neto no gravado
  "ImpNeto": 100, # Importe neto gravado
  "ImpOpEx": 0,   # Importe exento de IVA
  "ImpIVA": 21,  # Importe total de IVA
  "ImpTrib": 0,   # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada en el comprobante (ver tipos disponibles)("PES" para pesos argentinos) 
  "MonCotiz": 1,     # Cotización de la moneda usada (1 para pesos argentinos)  
  "CondicionIVAReceptorId" : 5, # Condición frente al IVA del receptor  
  "Iva": [ # (Opcional) Alícuotas asociadas al comprobante
    {
      "Id": 5, # Id del tipo de IVA (5 para 21%)(ver tipos disponibles) 
      "BaseImp": 100, # Base imponible
      "Importe": 21 # Importe 
    }
  ]
}

res = afip.ElectronicBilling.createVoucher(data, return_full_response)

res["CAE"] # CAE asignado el comprobante
res["CAEFchVto"] # Fecha de vencimiento del CAE (yyyy-mm-dd)
```

{% endtab %}

{% tab title="Python" %}
Debemos utilizar el método `createVoucher` pasándole como parámetro un Hash con los detalles del comprobante y si queremos tener la respuesta completa devuelta por el WS debemos pasarle como segundo parámetro true, en caso de no enviarle el segundo parámetro nos devolverá como respuesta `{ "CAE": CAE asignado el comprobante, "CAEFchVto" : Fecha de vencimiento del CAE (yyyy-mm-dd) }`.

```python
# Devolver respuesta completa del web service
return_full_response = False

# Info del comprobante
data = {
  "CantReg": 1,  # Cantidad de comprobantes a registrar
  "PtoVta": 1,  # Punto de venta
  "CbteTipo": 6,  # Tipo de comprobante (ver tipos disponibles) 
  "Concepto": 1,  # Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
  "DocTipo": 99, # Tipo de documento del comprador (99 consumidor final, ver tipos disponibles)
  "DocNro": 0,  # Número de documento del comprador (0 consumidor final)
  "CbteDesde": 1,  # Número de comprobante o numero del primer comprobante en caso de ser mas de uno
  "CbteHasta": 1,  # Número de comprobante o numero del último comprobante en caso de ser mas de uno
  "CbteFch": 20231220, # (Opcional) Fecha del comprobante (yyyymmdd) o fecha actual si es nulo
  "ImpTotal": 121, # Importe total del comprobante
  "ImpTotConc": 0,   # Importe neto no gravado
  "ImpNeto": 100, # Importe neto gravado
  "ImpOpEx": 0,   # Importe exento de IVA
  "ImpIVA": 21,  # Importe total de IVA
  "ImpTrib": 0,   # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada en el comprobante (ver tipos disponibles)("PES" para pesos argentinos) 
  "MonCotiz": 1,     # Cotización de la moneda usada (1 para pesos argentinos)  
  "CondicionIVAReceptorId" : 5, # Condición frente al IVA del receptor  
  "Iva": [ # (Opcional) Alícuotas asociadas al comprobante
    {
      "Id": 5, # Id del tipo de IVA (5 para 21%)(ver tipos disponibles) 
      "BaseImp": 100, # Base imponible
      "Importe": 21 # Importe 
    }
  ]
}

res = afip.ElectronicBilling.createVoucher(data, return_full_response)

res["CAE"] # CAE asignado el comprobante
res["CAEFchVto"] # Fecha de vencimiento del CAE (yyyy-mm-dd)
```

{% endtab %}

{% tab title=".NET" %}
Debemos utilizar el método `CreateVoucherAsync` pasándole como parámetro un Objeto con los detalles del comprobante y si queremos tener la respuesta completa enviada por el WS debemos pasarle como segundo parámetro `true`, en caso de no enviarle el segundo parámetro nos devolverá como respuesta `new Dictionary<string, object?> { ["CAE"] : CAE asignado el comprobante, ["CAEFchVto"] : Fecha de vencimiento del CAE (yyyy-mm-dd) }`.

```csharp
// Devolver respuesta completa del web service
bool returnFullResponse = false;

// Info del comprobante
var data = new Dictionary<string, object?>
{
    ["CantReg"] = 1, // Cantidad de comprobantes a registrar
    ["PtoVta"] = 1, // Punto de venta
    ["CbteTipo"] = 6, // Tipo de comprobante (ver tipos disponibles)
    ["Concepto"] = 1, // Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
    ["DocTipo"] = 99, // Tipo de documento del comprador (99 consumidor final, ver tipos disponibles)
    ["DocNro"] = 0, // Número de documento del comprador (0 consumidor final)
    ["CbteDesde"] = 1, // Número de comprobante o numero del primer comprobante en caso de ser mas de uno
    ["CbteHasta"] = 1, // Número de comprobante o numero del último comprobante en caso de ser mas de uno
    ["CbteFch"] = int.Parse(DateTime.UtcNow.ToString("yyyyMMdd")), // (Opcional) Fecha del comprobante (yyyymmdd) o fecha actual si es nulo
    ["ImpTotal"] = 121, // Importe total del comprobante
    ["ImpTotConc"] = 0, // Importe neto no gravado
    ["ImpNeto"] = 100, // Importe neto gravado
    ["ImpOpEx"] = 0, // Importe exento de IVA
    ["ImpIVA"] = 21, // Importe total de IVA
    ["ImpTrib"] = 0, // Importe total de tributos
    ["MonId"] = "PES", // Tipo de moneda usada en el comprobante (ver tipos disponibles)('PES' para pesos argentinos)
    ["MonCotiz"] = 1, // Cotización de la moneda usada (1 para pesos argentinos)
    ["CondicionIVAReceptorId"] = 5, // Condición frente al IVA del receptor
    ["Iva"] = new[] // (Opcional) Alícuotas asociadas al comprobante
    {
        new Dictionary<string, object?>
        {
            ["Id"] = 5, // Id del tipo de IVA (5 para 21%)(ver tipos disponibles)
            ["BaseImp"] = 100, // Base imponible
            ["Importe"] = 21 // Importe
        }
    }
};

var res = await afip.ElectronicBilling.CreateVoucherAsync(data, returnFullResponse);

res["CAE"]; //CAE asignado el comprobante
res["CAEFchVto"]; //Fecha de vencimiento del CAE (yyyy-mm-dd)
```

{% hint style="info" %}
Este método acepta mas parámetros, podes encontrar todos los parámetros disponibles [En este ejemplo](https://github.com/AfipSDK/afip.net/blob/main/examples/CreateVoucher/Program.cs)
{% endhint %}
{% endtab %}

{% tab title="Java" %}
Debemos utilizar el método `createVoucher` pasándole como parámetro un Map con los detalles del comprobante y si queremos tener la respuesta completa enviada por el WS debemos pasarle como segundo parámetro `true`, en caso de no enviarle el segundo parámetro nos devolverá como respuesta `Map<String, Object>` con `CAE` y `CAEFchVto`.

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Devolver respuesta completa del web service
boolean returnFullResponse = false;

// Info del comprobante
Map<String, Object> alicuota = new HashMap<>();
alicuota.put("Id", 5);       // Id del tipo de IVA (5 para 21%)(ver tipos disponibles)
alicuota.put("BaseImp", 100); // Base imponible
alicuota.put("Importe", 21);  // Importe

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);    // Cantidad de comprobantes a registrar
data.put("PtoVta",                1);    // Punto de venta
data.put("CbteTipo",              6);    // Tipo de comprobante (ver tipos disponibles)
data.put("Concepto",              1);    // Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
data.put("DocTipo",               99);   // Tipo de documento del comprador (99 consumidor final, ver tipos disponibles)
data.put("DocNro",                0);    // Número de documento del comprador (0 consumidor final)
data.put("CbteDesde",             1);    // Número de comprobante o numero del primer comprobante en caso de ser mas de uno
data.put("CbteHasta",             1);    // Número de comprobante o numero del último comprobante en caso de ser mas de uno
data.put("CbteFch",               Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()))); // (Opcional) Fecha del comprobante (yyyymmdd) o fecha actual si es nulo
data.put("ImpTotal",              121);  // Importe total del comprobante
data.put("ImpTotConc",            0);    // Importe neto no gravado
data.put("ImpNeto",               100);  // Importe neto gravado
data.put("ImpOpEx",               0);    // Importe exento de IVA
data.put("ImpIVA",                21);   // Importe total de IVA
data.put("ImpTrib",               0);    // Importe total de tributos
data.put("MonId",                 "PES"); // Tipo de moneda usada en el comprobante (ver tipos disponibles)('PES' para pesos argentinos)
data.put("MonCotiz",              1);    // Cotización de la moneda usada (1 para pesos argentinos)
data.put("CondicionIVAReceptorId", 5);   // Condición frente al IVA del receptor
data.put("Iva",                   Arrays.asList(alicuota)); // (Opcional) Alícuotas asociadas al comprobante

Map<String, Object> res = afip.electronicBilling().createVoucher(data, returnFullResponse);

res.get("CAE");       //CAE asignado el comprobante
res.get("CAEFchVto"); //Fecha de vencimiento del CAE (yyyy-mm-dd)
```

{% hint style="info" %}
Este método acepta mas parámetros, podes encontrar todos los parámetros disponibles [En este ejemplo](https://github.com/AfipSDK/afip.java/blob/main/examples/CreateVoucher.java)
{% endhint %}
{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq" : {
            "FeCabReq" : {
                "CantReg" 	: 1,
                "PtoVta" 	: 1,
                "CbteTipo" 	: 6
            },
            "FeDetReq" : { 
                "FECAEDetRequest" : {
                    "Concepto" : 1,
                    "DocTipo" : 99,
                    "DocNro" : 0,
                    "CbteDesde" : 1,
                    "CbteHasta" : 1,
                    "CbteFch" : 20240313,
                    "ImpTotal" : 121,
                    "ImpTotConc" : 0,
                    "ImpNeto" : 100,
                    "ImpOpEx" : 0,
                    "ImpIVA" : 21,
                    "ImpTrib" : 0,
                    "MonId" : "PES",
                    "MonCotiz" : 1,
                    "CondicionIVAReceptorId" : 5,
                    "Iva" : { 
                        "AlicIva": [{
                                "Id" : 5,
                                "BaseImp" : 100,
                                "Importe" : 21
                        }]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}

### **Crear y asignar CAE a siguiente comprobante**

{% tabs %}
{% tab title="Node" %}
Debemos utilizar el método `createNextVoucher` pasándole como parámetro un Objeto con los detalles del comprobante al igual que el método `createVoucher`, nos devolverá como respuesta `{ CAE : CAE asignado al comprobante, CAEFchVto : Fecha de vencimiento del CAE (yyyy-mm-dd), voucher_number : Número asignado al comprobante }`.

```js
const res = await afip.ElectronicBilling.createNextVoucher(data);

res['CAE']; //CAE asignado el comprobante
res['CAEFchVto']; //Fecha de vencimiento del CAE (yyyy-mm-dd)
res['voucher_number']; //Número asignado al comprobante
```

{% endtab %}

{% tab title="PHP" %}
Debemos utilizar el método `CreateNextVoucher` pasándole como parámetro un Array con los detalles del comprobante al igual que el método `CreateVoucher`, nos devolverá como respuesta `array(CAE => CAE asignado al comprobante, CAEFchVto => Fecha de vencimiento del CAE (yyyy-mm-dd), voucher_number => Número asignado al comprobante)`.

```php
$res = $afip->ElectronicBilling->CreateNextVoucher($data);

$res['CAE']; //CAE asignado el comprobante
$res['CAEFchVto']; //Fecha de vencimiento del CAE (yyyy-mm-dd)
$res['voucher_number']; //Número asignado al comprobante
```

{% endtab %}

{% tab title="Ruby" %}
Debemos utilizar el método `createNextVoucher` pasándole como parámetro un Hash con los detalles del comprobante al igual que el método `createVoucher`, nos devolverá como respuesta `{ "CAE" : CAE asignado al comprobante, "CAEFchVto" : Fecha de vencimiento del CAE (yyyy-mm-dd), "voucher_number" : Número asignado al comprobante }`.

```ruby
res = afip.ElectronicBilling.createNextVoucher(data)

res["CAE"] # CAE asignado el comprobante
res["CAEFchVto"] # Fecha de vencimiento del CAE (yyyy-mm-dd)
res["voucher_number"] # Número asignado al comprobante
```

{% endtab %}

{% tab title="Python" %}
Debemos utilizar el método `createNextVoucher` pasándole como parámetro un Hash con los detalles del comprobante al igual que el método `createVoucher`, nos devolverá como respuesta `{ "CAE" : CAE asignado al comprobante, "CAEFchVto" : Fecha de vencimiento del CAE (yyyy-mm-dd), "voucher_number" : Número asignado al comprobante }`.

```python
res = afip.ElectronicBilling.createNextVoucher(data)

res["CAE"] # CAE asignado el comprobante
res["CAEFchVto"] # Fecha de vencimiento del CAE (yyyy-mm-dd)
res["voucher_number"] # Número asignado al comprobante
```

{% endtab %}

{% tab title=".NET" %}
Debemos utilizar el método `CreateNextVoucherAsync` pasándole como parámetro un Objeto con los detalles del comprobante al igual que el método `CreateVoucherAsync`, nos devolverá como respuesta `new Dictionary<string, object?> { ["CAE"] : CAE asignado el comprobante, ["CAEFchVto"] : Fecha de vencimiento del CAE (yyyy-mm-dd) }`.

```csharp
var res = await afip.ElectronicBilling.CreateNextVoucherAsync(data);

res["CAE"]; //CAE asignado el comprobante
res["CAEFchVto"]; //Fecha de vencimiento del CAE (yyyy-mm-dd)
res["voucher_number"]; //Número asignado al comprobante
```

{% endtab %}

{% tab title="Java" %}
Debemos utilizar el método `createNextVoucher` pasándole como parámetro un Map con los detalles del comprobante al igual que el método `createVoucher`, nos devolverá como respuesta `Map<String, Object>` con `.get("CAE")`, `.get("CAEFchVto")` y `.get("voucher_number")`.

```java
Map<String, Object> res = afip.electronicBilling().createNextVoucher(data);

res.get("CAE"); //CAE asignado el comprobante
res.get("CAEFchVto"); //Fecha de vencimiento del CAE (yyyy-mm-dd)
res.get("voucher_number"); //Número asignado al comprobante
```

{% endtab %}

{% tab title="API" %}
Se debe llamar al endpoint [Obtener número del último comprobante creado](#obtener-numero-del-ultimo-comprobante-creado), al numero de comprobante que nos devuelve sumarle `1`, y llamar al endpoint [Crear y asignar CAE a un comprobante](#crear-y-asignar-cae-a-un-comprobante)
{% endtab %}
{% endtabs %}

### **Obtener información de un comprobante ya emitido**

Con este método podemos obtener toda la información relacionada a un comprobante o simplemente saber si el comprobante existe.

{% tabs %}
{% tab title="Node" %}

```js
// Numero de comprobante
const numeroDeComprobante = 1;

// Numero de punto de venta
const puntoDeVenta = 1;

// Tipo de comprobante
const tipoDeComprobante = 6; // 6 = Factura B

const voucherInfo = await afip.ElectronicBilling.getVoucherInfo(numeroDeComprobante, puntoDeVenta, tipoDeComprobante);

if(voucherInfo === null){
    console.log('El comprobante no existe');
}
else{
    console.log('Esta es la información del comprobante:');
    console.log(voucherInfo);
}
```

{% endtab %}

{% tab title="PHP" %}

```php
// Numero de comprobante
$numero_de_comprobante = 1;

// Numero de punto de venta
$punto_de_venta = 1;

// Tipo de comprobante
$tipo_de_comprobante = 6; // 6 = Factura B

$voucher_info = $afip->ElectronicBilling->GetVoucherInfo($numero_de_comprobante, $punto_de_venta, $tipo_de_comprobante);

if($voucher_info === NULL){
    echo 'El comprobante no existe';
}
else{
    echo 'Esta es la información del comprobante:';
    echo '<pre>';
    print_r($voucher_info);
    echo '</pre>';
}
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# Numero de comprobante
numero_de_comprobante = 1

# Numero de punto de venta
punto_de_venta = 1

# Tipo de comprobante
tipo_de_comprobante = 6 # 6 = Factura B

voucher_info = afip.ElectronicBilling.getVoucherInfo(numero_de_comprobante, punto_de_venta, tipo_de_comprobante)

puts  "Esta es la información del comprobante:"
puts voucher_info
```

{% endtab %}

{% tab title="Python" %}

```python
# Numero de comprobante
numero_de_comprobante = 1

# Numero de punto de venta
punto_de_venta = 1

# Tipo de comprobante
tipo_de_comprobante = 6 # 6 = Factura B

voucher_info = afip.ElectronicBilling.getVoucherInfo(numero_de_comprobante, punto_de_venta, tipo_de_comprobante)

print("Esta es la información del comprobante:")
print(voucher_info)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero de comprobante
int numeroDeComprobante = 1;

// Numero de punto de venta
int puntoDeVenta = 1;

// Tipo de comprobante
int tipoDeComprobante = 6; // 6 = Factura B

var voucherInfo = await afip.ElectronicBilling.GetVoucherInfoAsync(numeroDeComprobante, puntoDeVenta, tipoDeComprobante);

if (voucherInfo == null) {
    Console.WriteLine("El comprobante no existe");
} else {
    Console.WriteLine("Esta es la información del comprobante:");
    Console.WriteLine(JsonSerializer.Serialize(voucherInfo));
}
```

{% endtab %}

{% tab title="Java" %}

```java
// Numero de comprobante
int numeroDeComprobante = 1;

// Numero de punto de venta
int puntoDeVenta = 1;

// Tipo de comprobante
int tipoDeComprobante = 6; // 6 = Factura B

Map<String, Object> voucherInfo = afip.electronicBilling().getVoucherInfo(numeroDeComprobante, puntoDeVenta, tipoDeComprobante);

if (voucherInfo == null) {
    System.out.println("El comprobante no existe");
} else {
    System.out.println("Esta es la información del comprobante:");
    System.out.println(voucherInfo);
}
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECompConsultar",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCompConsReq" : {
            "CbteNro" : 10,
            "PtoVta" : 1,
            "CbteTipo" : 6
        }
    }
}
```

{% endtab %}
{% endtabs %}

### **Crear CAEA**

{% tabs %}
{% tab title="Node" %}

```javascript
// Periodo del CAEA. (yyyymm) 
const periodo = 202307;

// Orden del CAEA dentro del periodo. Quincena 1, Quincena 2 
const orden = 1;

const caeaInfo = await afip.ElectronicBilling.createCAEA(periodo, orden);

```

{% endtab %}

{% tab title="PHP" %}

```php
// Periodo del CAEA. (yyyymm) 
$periodo = 202307;

// Orden del CAEA dentro del periodo. Quincena 1, Quincena 2 
$orden = 1;

$caea_info = $afip->ElectronicBilling->CreateCAEA($periodo, $orden);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# Periodo del CAEA. (yyyymm) 
periodo = 202307

# Orden del CAEA dentro del periodo. Quincena 1, Quincena 2 
orden = 1

caea_info = afip.ElectronicBilling.createCAEA(periodo, orden)
```

{% endtab %}

{% tab title="Python" %}

```python
# Periodo del CAEA. (yyyymm) 
periodo = 202307

# Orden del CAEA dentro del periodo. Quincena 1, Quincena 2 
orden = 1

caea_info = afip.ElectronicBilling.createCAEA(periodo, orden)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Periodo del CAEA. (yyyymm) 
int periodo = 202307;

// Orden del CAEA dentro del periodo. Quincena 1, Quincena 2 
int orden = 1;

var caeaInfo = await afip.ElectronicBilling.CreateCAEAAsync(periodo, orden);

```

{% endtab %}

{% tab title="Java" %}

```java
// Periodo del CAEA. (yyyymm) 
int periodo = 202307;

// Orden del CAEA dentro del periodo. Quincena 1, Quincena 2 
int orden = 1;

Map<String, Object> caeaInfo = afip.electronicBilling().createCAEA(periodo, orden);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAEASolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "Periodo": 202403,
        "Orden": 1
    }
}
```

{% endtab %}
{% endtabs %}

### **Obtener información de CAEA ya emitido**

{% tabs %}
{% tab title="Node" %}

```javascript
// Periodo del CAEA. (yyyymm) 
const periodo = 202307;

// Orden del CAEA dentro del periodo. Quincena 1, Quincena 2 
const orden = 1;

const caeaInfo = await afip.ElectronicBilling.getCAEA(periodo, orden);
```

{% endtab %}

{% tab title="PHP" %}

```php
// Periodo del CAEA. (yyyymm) 
$periodo = 202307;

// Orden del CAEA dentro del periodo. Quincena 1, Quincena 2 
$orden = 1;

$caea_info = $afip->ElectronicBilling->GetCAEA($periodo, $orden);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# Periodo del CAEA. (yyyymm) 
periodo = 202307

# Orden del CAEA dentro del periodo. Quincena 1, Quincena 2 
orden = 1

caea_info = afip.ElectronicBilling.getCAEA(periodo, orden)
```

{% endtab %}

{% tab title="Python" %}

```python
# Periodo del CAEA. (yyyymm) 
periodo = 202307

# Orden del CAEA dentro del periodo. Quincena 1, Quincena 2 
orden = 1

caea_info = afip.ElectronicBilling.getCAEA(periodo, orden)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Periodo del CAEA. (yyyymm) 
int periodo = 202307;

// Orden del CAEA dentro del periodo. Quincena 1, Quincena 2 
int orden = 1;

var caeaInfo = await afip.ElectronicBilling.GetCAEAAsync(periodo, orden);
```

{% endtab %}

{% tab title="Java" %}

```java
// Periodo del CAEA. (yyyymm)
int periodo = 202307;

// Orden del CAEA dentro del periodo. Quincena 1, Quincena 2 
int orden = 1;

Map<String, Object> caeaInfo = afip.electronicBilling().getCAEA(periodo, orden);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAEAConsultar",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "Periodo": 202403,
        "Orden": 1
    }
}
```

{% endtab %}
{% endtabs %}

### **Obtener puntos de venta disponibles**

{% hint style="warning" %}
Es normal recibir un error en testing ya que no existen puntos de venta para testing (siempre se usa `1`)
{% endhint %}

{% tabs %}
{% tab title="Node" %}

```js
const salesPoints = await afip.ElectronicBilling.getSalesPoints()
```

{% endtab %}

{% tab title="PHP" %}

```php
$sales_points = $afip->ElectronicBilling->GetSalesPoints();
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
sales_points = afip.ElectronicBilling.getSalesPoints
```

{% endtab %}

{% tab title="Python" %}

```python
sales_points = afip.ElectronicBilling.getSalesPoints()
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var salesPoints = await afip.ElectronicBilling.GetSalesPointsAsync()
```

{% endtab %}

{% tab title="Java" %}

```java
List<Map<String, Object>> salesPoints = afip.electronicBilling().getSalesPoints();
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FEParamGetPtosVenta",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        }
    }
}
```

{% endtab %}
{% endtabs %}

### **Obtener tipos de comprobantes disponibles**

{% tabs %}
{% tab title="Node" %}

```js
const voucherTypes = await afip.ElectronicBilling.getVoucherTypes();
```

{% endtab %}

{% tab title="PHP" %}

```php
$voucher_types = $afip->ElectronicBilling->GetVoucherTypes();
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
voucher_types = afip.ElectronicBilling.getVoucherTypes
```

{% endtab %}

{% tab title="Python" %}

```python
voucher_types = afip.ElectronicBilling.getVoucherTypes()
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var voucherTypes = await afip.ElectronicBilling.GetVoucherTypesAsync();
```

{% endtab %}

{% tab title="Java" %}

```java
List<Map<String, Object>> voucherTypes = afip.electronicBilling().getVoucherTypes();
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FEParamGetTiposCbte",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        }
    }
}
```

{% endtab %}
{% endtabs %}

### **Obtener tipos de conceptos disponibles**

{% tabs %}
{% tab title="Node" %}

```js
const conceptTypes = await afip.ElectronicBilling.getConceptTypes();
```

{% endtab %}

{% tab title="PHP" %}

```php
$concept_types = $afip->ElectronicBilling->GetConceptTypes();
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
concept_types = afip.ElectronicBilling.getConceptTypes
```

{% endtab %}

{% tab title="Python" %}

```python
concept_types = afip.ElectronicBilling.getConceptTypes()
```

{% endtab %}

{% tab title=".NET" %}

```csharp
const conceptTypes = await afip.ElectronicBilling.GetConceptTypesAsync();
```

{% endtab %}

{% tab title="Java" %}

```java
List<Map<String, Object>> conceptTypes = afip.electronicBilling().getConceptTypes();
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FEParamGetTiposConcepto",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        }
    }
}
```

{% endtab %}
{% endtabs %}

### **Obtener tipos de documentos disponibles**

{% tabs %}
{% tab title="Node" %}

```js
const documentTypes = await afip.ElectronicBilling.getDocumentTypes();
```

{% endtab %}

{% tab title="PHP" %}

```php
$document_types = $afip->ElectronicBilling->GetDocumentTypes();
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
document_types = afip.ElectronicBilling.getDocumentTypes
```

{% endtab %}

{% tab title="Python" %}

```python
document_types = afip.ElectronicBilling.getDocumentTypes()
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var documentTypes = await afip.ElectronicBilling.GetDocumentTypesAsync();
```

{% endtab %}

{% tab title="Java" %}

```java
List<Map<String, Object>> documentTypes = afip.electronicBilling().getDocumentTypes();
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FEParamGetTiposDoc",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        }
    }
}
```

{% endtab %}
{% endtabs %}

### **Obtener tipos de alícuotas disponibles**

{% tabs %}
{% tab title="Node" %}

```js
const aloquotTypes = await afip.ElectronicBilling.getAliquotTypes();
```

{% endtab %}

{% tab title="PHP" %}

```php
$aloquot_types = $afip->ElectronicBilling->GetAliquotTypes();
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
aloquot_types = afip.ElectronicBilling.getAliquotTypes
```

{% endtab %}

{% tab title="Python" %}

```python
aloquot_types = afip.ElectronicBilling.getAliquotTypes()
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var aloquotTypes = await afip.ElectronicBilling.GetAliquotTypesAsync();
```

{% endtab %}

{% tab title="Java" %}

```java
List<Map<String, Object>> aloquotTypes = afip.electronicBilling().getAliquotTypes();
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FEParamGetTiposIva",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        }
    }
}
```

{% endtab %}
{% endtabs %}

### **Obtener tipos de monedas disponibles**

{% tabs %}
{% tab title="Node" %}

```js
const currenciesTypes = await afip.ElectronicBilling.getCurrenciesTypes();
```

{% endtab %}

{% tab title="PHP" %}

```php
$currencies_types = $afip->ElectronicBilling->GetCurrenciesTypes();
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
currencies_types = afip.ElectronicBilling.getCurrenciesTypes
```

{% endtab %}

{% tab title="Python" %}

```python
currencies_types = afip.ElectronicBilling.getCurrenciesTypes()
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var currenciesTypes = await afip.ElectronicBilling.GetCurrenciesTypesAsync();
```

{% endtab %}

{% tab title="Java" %}

```java
List<Map<String, Object>> currenciesTypes = afip.electronicBilling().getCurrenciesTypes();
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FEParamGetTiposMonedas",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        
    }
}
```

{% endtab %}
{% endtabs %}

### Obtener cotización de moneda

{% tabs %}
{% tab title="Node" %}

```js
// ID de la moneda a consultar (El ID se obtiene del método para obtener los tipos de monedas)
const currencyID = 'DOL'

// Fecha de la cotización en formato aaaammdd | Por ej. 20250221 = 21 de febrero de 2025
const rateDate = '20250221';

const exchangeRate =  await afip.ElectronicBilling.executeRequest('FEParamGetCotizacion', {
    MonId: currencyID,
    FchCotiz: rateDate
})
```

{% endtab %}

{% tab title="PHP" %}

```php
// ID de la moneda a consultar (El ID se obtiene del método para obtener los tipos de monedas)
$currency_id = 'DOL'

// Fecha de la cotización en formato aaaammdd | Por ej. 20250221 = 21 de febrero de 2025
$rate_date = '20250221';

$exchange_rate =  $afip->ElectronicBilling->ExecuteRequest('FEParamGetCotizacion', array(
    "MonId" => $currency_id,
    "FchCotiz" => $rate_date
));
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# ID de la moneda a consultar (El ID se obtiene del método para obtener los tipos de monedas)
currency_id = 'DOL'

# Fecha de la cotización en formato aaaammdd | Por ej. 20250221 = 21 de febrero de 2025
rate_date = '20250221';

exchange_rate =  afip.ElectronicBilling.executeRequest('FEParamGetCotizacion', {
    "MonId": currency_id,
    "FchCotiz": rate_date
});
```

{% endtab %}

{% tab title="Python" %}

```python
# ID de la moneda a consultar (El ID se obtiene del método para obtener los tipos de monedas)
currency_id = 'DOL'

# Fecha de la cotización en formato aaaammdd | Por ej. 20250221 = 21 de febrero de 2025
rate_date = '20250221';

exchange_rate =  afip.ElectronicBilling.executeRequest('FEParamGetCotizacion', {
    "MonId": currency_id,
    "FchCotiz": rate_date
});
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// ID de la moneda a consultar (El ID se obtiene del método para obtener los tipos de monedas)
string currencyID = 'DOL'

// Fecha de la cotización en formato aaaammdd | Por ej. 20250221 = 21 de febrero de 2025
string rateDate = '20250221';

var exchangeRate =  await afip.ElectronicBilling.ExecuteRequestAsync<Dictionary<string, object?>>(
    "FEParamGetCotizacion", 
    new Dictionary<string, object?> {
        ["MonId"] = currencyID,
        ["FchCotiz"] = rateDate
    });
```

{% endtab %}

{% tab title="Java" %}

```java
// ID de la moneda a consultar (El ID se obtiene del método para obtener los tipos de monedas)
String currencyID = "DOL";

// Fecha de la cotización en formato aaaammdd | Por ej. 20250221 = 21 de febrero de 2025
String rateDate = "20250221";

Map<String, Object> params = new HashMap<>();
params.put("MonId", currencyID);
params.put("FchCotiz", rateDate);

Map<String, Object> exchangeRate = afip.electronicBilling().executeRequest("FEParamGetCotizacion", params);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FEParamGetCotizacion",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "MonId": "DOL",
        "FchCotiz": "20250221"
    }
}
```

{% endtab %}
{% endtabs %}

### **Obtener tipos de opciones disponibles para el comprobante**

{% tabs %}
{% tab title="Node" %}

```js
const optionTypes = await afip.ElectronicBilling.getOptionsTypes();
```

{% endtab %}

{% tab title="PHP" %}

```php
$option_types = $afip->ElectronicBilling->GetOptionsTypes();
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
option_types = afip.ElectronicBilling.getOptionsTypes
```

{% endtab %}

{% tab title="Python" %}

```python
option_types = afip.ElectronicBilling.getOptionsTypes()
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var optionTypes = await afip.ElectronicBilling.GetOptionsTypesAsync();
```

{% endtab %}

{% tab title="Java" %}

```java
List<Map<String, Object>> optionTypes = afip.electronicBilling().getOptionsTypes();
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FEParamGetTiposOpcional",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        }
    }
}
```

{% endtab %}
{% endtabs %}

### **Obtener tipos de tributos disponibles**

{% tabs %}
{% tab title="Node" %}

```js
const taxTypes = await afip.ElectronicBilling.getTaxTypes();
```

{% endtab %}

{% tab title="PHP" %}

<pre class="language-php"><code class="lang-php"><strong>$tax_types = $afip->ElectronicBilling->GetTaxTypes();
</strong></code></pre>

{% endtab %}

{% tab title="Ruby" %}

```ruby
tax_types = afip.ElectronicBilling.getTaxTypes
```

{% endtab %}

{% tab title="Python" %}

```python
tax_types = afip.ElectronicBilling.getTaxTypes()
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var taxTypes = await afip.ElectronicBilling.GetTaxTypesAsync();
```

{% endtab %}

{% tab title="Java" %}

```java
List<Map<String, Object>> taxTypes = afip.electronicBilling().getTaxTypes();
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FEParamGetTiposTributos",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        }
    }
}
```

{% endtab %}
{% endtabs %}

### **Obtener tipos de** condiciones frente al IVA **disponibles**

{% tabs %}
{% tab title="Node" %}

```js
const taxConditionTypes =  await afip.ElectronicBilling.executeRequest('FEParamGetCondicionIvaReceptor')
```

{% endtab %}

{% tab title="PHP" %}

```php
$tax_condition_types = $afip->ElectronicBilling->ExecuteRequest('FEParamGetCondicionIvaReceptor');
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
tax_condition_types = afip.ElectronicBilling.executeRequest('FEParamGetCondicionIvaReceptor')
```

{% endtab %}

{% tab title="Python" %}

```python
tax_condition_types = afip.ElectronicBilling.executeRequest('FEParamGetCondicionIvaReceptor')
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var taxConditionTypes =  await afip.ElectronicBilling.ExecuteRequestAsync<Dictionary<string, object?>>('FEParamGetCondicionIvaReceptor');
```

{% endtab %}

{% tab title="Java" %}

```java
Map<String, Object> taxConditionTypes = afip.electronicBilling().executeRequest("FEParamGetCondicionIvaReceptor", new HashMap<>());
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FEParamGetCondicionIvaReceptor",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        }
    }
}
```

{% endtab %}
{% endtabs %}

### **Transformar formato de fecha que utiliza AFIP**

De `yyyymmdd` a `yyyy-mm-dd`

{% tabs %}
{% tab title="Node" %}

```js
const date = afip.ElectronicBilling.formatDate('19970508'); //Nos devuelve 1997-05-08
```

{% endtab %}

{% tab title="PHP" %}

```php
$date = $afip->ElectronicBilling->FormatDate('19970508'); //Nos devuelve 1997-05-08
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
date = afip.ElectronicBilling.formatDate('19970508') # Nos devuelve 1997-05-08
```

{% endtab %}

{% tab title="Python" %}

```python
date = afip.ElectronicBilling.formatDate('19970508') # Nos devuelve 1997-05-08
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var date = afip.ElectronicBilling.FormatDate('19970508'); //Nos devuelve 1997-05-08
```

{% endtab %}

{% tab title="Java" %}

```java
String date = new SimpleDateFormat("yyyy-MM-dd").format(
    new SimpleDateFormat("yyyyMMdd").parse("19970508")
); // Nos devuelve 1997-05-08
```

{% endtab %}

{% tab title="API" %}
Si lo necesitas, a esto podes implementarlo con el lenguaje que utilices.
{% endtab %}
{% endtabs %}

### **Obtener estado del servidor**

{% hint style="warning" %}
No te confíes mucho de este método, ARCA siempre devuelve que esta todo bien incluso cuando hay algo fallando.
{% endhint %}

{% tabs %}
{% tab title="Node" %}

```js
const serverStatus = await afip.ElectronicBilling.getServerStatus();

console.log('Este es el estado del servidor:');
console.log(serverStatus);
```

{% endtab %}

{% tab title="PHP" %}

```php
$server_status = $afip->ElectronicBilling->GetServerStatus();

echo 'Este es el estado del servidor:';
echo '<pre>';
print_r($server_status);
echo '</pre>';
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
server_status = afip.ElectronicBilling.getServerStatus

puts "Este es el estado del servidor:"
puts server_status
```

{% endtab %}

{% tab title="Python" %}

```python
server_status = afip.ElectronicBilling.getServerStatus()

print("Este es el estado del servidor:")
print(server_status)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var serverStatus = await afip.ElectronicBilling.GetServerStatusAsync();

Console.WriteLine('Este es el estado del servidor:');
Console.WriteLine(JsonSerializer.Serialize(serverStatus));
```

{% endtab %}

{% tab title="Java" %}

```java
Map<String, Object> serverStatus = afip.electronicBilling().getServerStatus();

System.out.println("Este es el estado del servidor:");
System.out.println(serverStatus);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FEDummy",
    "wsid": "wsfe",
    "params": {}
}
```

{% endtab %}
{% endtabs %}


# Crear PDF

{% hint style="info" %}
Esta documentación se movió a:

<https://afipsdk.com/docs/pdfs/introduction/>
{% endhint %}

👉 [Ir a la nueva documentación de PDFs](https://afipsdk.com/docs/pdfs/introduction/)


# Código QR

## Paso 1 - Armar el texto que lleva el QR

El texto del QR se arma siguiendo la siguiente especificación

<https://www.afip.gob.ar/fe/qr/documentos/QRespecificaciones.pdf>

## Paso 2 - Generar la imagen del QR

Una vez tenemos el texto para el QR nos queda generar la imagen, esto se puede hacer con cualquier librería Open Source

{% tabs %}
{% tab title="Node" %}
{% embed url="<https://www.npmjs.com/package/qrcode>" %}
{% endtab %}

{% tab title="PHP" %}
{% embed url="<https://github.com/endroid/qr-code>" %}
{% endtab %}

{% tab title="Ruby" %}
{% embed url="<https://github.com/whomwah/rqrcode>" %}
{% endtab %}

{% tab title="Python" %}
{% embed url="<https://github.com/heuer/segno>" %}
{% endtab %}

{% tab title="API" %}
Esto dependerá del lenguaje o plataforma que estén utilizando.
{% endtab %}
{% endtabs %}

Eso es todo, este QR se lo agregas al comprobante que le presentes al cliente


# Factura A

{% tabs %}
{% tab title="Node" %}
{% code fullWidth="false" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_factura = 1; // 1 = Factura A
	
	/**
	 * Número de la ultima Factura A
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura);

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 80;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 33693450239;

	/**
	 * Numero de factura
	 **/
	const numero_de_factura = last_voucher+1;

	/**
	 * Fecha de la factura en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe sujeto al IVA (sin icluir IVA)
	 **/
	const importe_gravado = 100;

	/**
	 * Importe exento al IVA
	 **/
	const importe_exento_iva = 0;

	/**
	 * Importe de IVA
	 **/
	const importe_iva = 21;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 1;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	
	let fecha_servicio_desde = null, fecha_servicio_hasta = null, fecha_vencimiento_pago = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;

		/**
		 * Fecha de vencimiento del pago en formato aaaammdd
		 **/
		const fecha_vencimiento_pago = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de facturas a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_factura, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_factura,
		'CbteHasta' : numero_de_factura,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : fecha_vencimiento_pago,
		'ImpTotal' 	: importe_gravado + importe_iva + importe_exento_iva,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_gravado,
		'ImpOpEx' 	: importe_exento_iva,
		'ImpIVA' 	: importe_iva,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada en la factura ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos)  
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'Iva' 		: [ // Alícuotas asociadas a la factura
			{
				'Id' 		: 5, // Id del tipo de IVA (5 = 21%)
				'BaseImp' 	: importe_gravado,
				'Importe' 	: importe_iva 
			}
		]
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endcode %}
{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de factura
 **/
$tipo_de_factura = 1; // 1 = Factura A

/**
 * Número de la ultima Factura A
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_factura);

/**
 * Concepto de la factura
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 80;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 33693450239;

/**
 * Numero de factura
 **/
$numero_de_factura = $last_voucher+1;

/**
 * Fecha de la factura en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Importe sujeto al IVA (sin icluir IVA)
 **/
$importe_gravado = 100;

/**
 * Importe exento al IVA
 **/
$importe_exento_iva = 0;

/**
 * Importe de IVA
 **/
$importe_iva = 21;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 1;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));

	/**
	 * Fecha de vencimiento del pago en formato aaaammdd
	 **/
	$fecha_vencimiento_pago = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
	$fecha_vencimiento_pago = null;
}

$data = array(
	'CantReg' 	=> 1, // Cantidad de facturas a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_factura, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_factura,
	'CbteHasta' => $numero_de_factura,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => $fecha_vencimiento_pago,
	'ImpTotal' 	=> $importe_gravado + $importe_iva + $importe_exento_iva,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_gravado,
	'ImpOpEx' 	=> $importe_exento_iva,
	'ImpIVA' 	=> $importe_iva,
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en la factura ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)  
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'Iva' 		=> array(// Alícuotas asociadas al factura
		array(
			'Id' 		=> 5, // Id del tipo de IVA (5 = 21%)
			'BaseImp' 	=> $importe_gravado,
			'Importe' 	=> $importe_iva 
		)
	), 
);

/** 
 * Creamos la Factura 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Factura 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Factura
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_factura = 1 # 1 = Factura A

# Número de la ultima Factura A
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura)

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de factura
numero_de_factura = last_voucher+1

# Fecha de la factura en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 1

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
	# Fecha de inicio de servicio en formato aaaammdd
	fecha_servicio_desde = Time.now.strftime("%Y%m%d").to_i
	
	# Fecha de fin de servicio en formato aaaammdd
	fecha_servicio_hasta = Time.now.strftime("%Y%m%d").to_i
	
	# Fecha de vencimiento del pago en formato aaaammdd
	fecha_vencimiento_pago = Time.now.strftime("%Y%m%d").to_i
else
	fecha_servicio_desde = nil
	fecha_servicio_hasta = nil
	fecha_vencimiento_pago = nil
end

data = {
	"CantReg": 1, # Cantidad de facturas a registrar
	"PtoVta": punto_de_venta,
	"CbteTipo": tipo_de_factura, 
	"Concepto": concepto,
	"DocTipo": tipo_de_documento,
	"DocNro": numero_de_documento,
	"CbteDesde": numero_de_factura,
	"CbteHasta": numero_de_factura,
	"CbteFch": fecha,
	"FchServDesde": fecha_servicio_desde,
	"FchServHasta": fecha_servicio_hasta,
	"FchVtoPago": fecha_vencimiento_pago,
	"ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
	"ImpTotConc": 0, # Importe neto no gravado
	"ImpNeto": importe_gravado,
	"ImpOpEx": importe_exento_iva,
	"ImpIVA": importe_iva,
	"ImpTrib": 0, # Importe total de tributos
	"MonId": "PES", # Tipo de moneda usada en la factura ("PES" = pesos argentinos) 
	"MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos)  
	"CondicionIVAReceptorId" : condicion_iva_receptor, 
	"Iva": [ # Alícuotas asociadas al factura
		{
			"Id": 5, # Id del tipo de IVA (5 = 21%)
			"BaseImp": importe_gravado,
			"Importe": importe_iva 
    		}
    	]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
puts {
	"cae": res["CAE"], # CAE asignado a la Factura
	"vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_factura = 1 # 1 = Factura A

# Número de la ultima Factura A
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura)

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de factura
numero_de_factura = last_voucher+1

# Fecha de la factura en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 1

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
	# Fecha de inicio de servicio en formato aaaammdd
	fecha_servicio_desde = int(datetime.today().strftime("%Y%m%d"))
	
	# Fecha de fin de servicio en formato aaaammdd
	fecha_servicio_hasta = int(datetime.today().strftime("%Y%m%d"))
	
	# Fecha de vencimiento del pago en formato aaaammdd
	fecha_vencimiento_pago = int(datetime.today().strftime("%Y%m%d"))
else:
	fecha_servicio_desde = None
	fecha_servicio_hasta = None
	fecha_vencimiento_pago = None

data = {
	"CantReg": 1, # Cantidad de facturas a registrar
	"PtoVta": punto_de_venta,
	"CbteTipo": tipo_de_factura, 
	"Concepto": concepto,
	"DocTipo": tipo_de_documento,
	"DocNro": numero_de_documento,
	"CbteDesde": numero_de_factura,
	"CbteHasta": numero_de_factura,
	"CbteFch": fecha,
	"FchServDesde": fecha_servicio_desde,
	"FchServHasta": fecha_servicio_hasta,
	"FchVtoPago": fecha_vencimiento_pago,
	"ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
	"ImpTotConc": 0, # Importe neto no gravado
	"ImpNeto": importe_gravado,
	"ImpOpEx": importe_exento_iva,
	"ImpIVA": importe_iva,
	"ImpTrib": 0, # Importe total de tributos
	"MonId": "PES", # Tipo de moneda usada en la factura ("PES" = pesos argentinos) 
	"MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos)  
	"CondicionIVAReceptorId" : condicion_iva_receptor, 
	"Iva": [ # Alícuotas asociadas al factura
		{
			"Id": 5, # Id del tipo de IVA (5 = 21%)
			"BaseImp": importe_gravado,
			"Importe": importe_iva 
    		}
    	]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
print({
	"cae": res["CAE"], # CAE asignado a la Factura
	"vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de factura (1 = Factura A)
int tipoDeFactura = 1;

// Número de la ultima Factura A
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeFactura);

// Concepto de la factura
// 1 = Productos
// 2 = Servicios
// 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento del comprador
// 80 = CUIT
// 86 = CUIL
// 96 = DNI
// 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239;

// Numero de factura
int numeroDeFactura = lastVoucher + 1;

// Fecha de la factura en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe sujeto al IVA (sin incluir IVA)
decimal importeGravado = 100;

// Importe exento al IVA
decimal importeExentoIva = 0;

// Importe de IVA
decimal importeIva = 21;

// Condición frente al IVA del receptor
// 1  = IVA Responsable Inscripto
// 4  = IVA Sujeto Exento
// 5  = Consumidor Final
// 6  = Responsable Monotributo
// 7  = Sujeto No Categorizado
// 8  = Proveedor del Exterior
// 9  = Cliente del Exterior
// 10 = IVA Liberado – Ley N° 19.640
// 13 = Monotributista Social
// 15 = IVA No Alcanzado
// 16 = Monotributo Trabajador Independiente Promovido
int condicionIvaReceptor = 1;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3)
{
    // Fecha de inicio de servicio en formato aaaammdd
    fechaServicioDesde = 20191213;

    // Fecha de fin de servicio en formato aaaammdd
    fechaServicioHasta = 20191213;

    // Fecha de vencimiento del pago en formato aaaammdd
    fechaVencimientoPago = 20191213;
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },                                            // Cantidad de facturas a registrar
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeFactura },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeFactura },
    { "CbteHasta",              numeroDeFactura },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeGravado + importeIva + importeExentoIva },
    { "ImpTotConc",             0 },                                            // Importe neto no gravado
    { "ImpNeto",                importeGravado },
    { "ImpOpEx",                importeExentoIva },
    { "ImpIVA",                 importeIva },
    { "ImpTrib",                0 },                                            // Importe total de tributos
    { "MonId",                  "PES" },                                        // Tipo de moneda ('PES' = pesos argentinos)
    { "MonCotiz",               1 },                                            // Cotización de la moneda (1 para pesos argentinos)
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "Iva", new List<Dictionary<string, object?>>                              // Alícuotas asociadas a la factura
        {
            new Dictionary<string, object?>
            {
                { "Id",      5 },                // Id del tipo de IVA (5 = 21%)
                { "BaseImp", importeGravado },
                { "Importe", importeIva }
            }
        }
    }
};

// Creamos la Factura
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

// Mostramos por pantalla los datos de la nueva Factura
Console.WriteLine($"CAE: {res["CAE"]}");                // CAE asignado a la Factura
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");  // Fecha de vencimiento del CAE
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de factura (1 = Factura A)
int tipoDeFactura = 1;

// Número de la ultima Factura A
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeFactura);

// Concepto de la factura
// 1 = Productos
// 2 = Servicios
// 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento del comprador
// 80 = CUIT
// 86 = CUIL
// 96 = DNI
// 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239L;

// Numero de factura
int numeroDeFactura = lastVoucher + 1;

// Fecha de la factura en formato aaaammdd
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe sujeto al IVA (sin incluir IVA)
double importeGravado = 100.0;

// Importe exento al IVA
double importeExentoIva = 0;

// Importe de IVA
double importeIva = 21.0;

// Condición frente al IVA del receptor
// 1  = IVA Responsable Inscripto
// 4  = IVA Sujeto Exento
// 5  = Consumidor Final
// 6  = Responsable Monotributo
// 7  = Sujeto No Categorizado
// 8  = Proveedor del Exterior
// 9  = Cliente del Exterior
// 10 = IVA Liberado – Ley N° 19.640
// 13 = Monotributista Social
// 15 = IVA No Alcanzado
// 16 = Monotributo Trabajador Independiente Promovido
int condicionIvaReceptor = 1;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3) {
    // Fecha de inicio de servicio en formato aaaammdd
    fechaServicioDesde = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

    // Fecha de fin de servicio en formato aaaammdd
    fechaServicioHasta = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

    // Fecha de vencimiento del pago en formato aaaammdd
    fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> alicuota = new HashMap<>();
alicuota.put("Id", 5); // Id del tipo de IVA (5 = 21%)
alicuota.put("BaseImp", importeGravado);
alicuota.put("Importe", importeIva);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);                                          // Cantidad de facturas a registrar
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeFactura);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeFactura);
data.put("CbteHasta",             numeroDeFactura);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeGravado + importeIva + importeExentoIva);
data.put("ImpTotConc",            0);                                          // Importe neto no gravado
data.put("ImpNeto",               importeGravado);
data.put("ImpOpEx",               importeExentoIva);
data.put("ImpIVA",                importeIva);
data.put("ImpTrib",               0);                                          // Importe total de tributos
data.put("MonId",                 "PES");                                      // Tipo de moneda ('PES' = pesos argentinos)
data.put("MonCotiz",              1);                                          // Cotización de la moneda (1 para pesos argentinos)
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("Iva",                   Arrays.asList(alicuota));                    // Alícuotas asociadas a la factura

// Creamos la Factura
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

// Mostramos por pantalla los datos de la nueva Factura
System.out.println("CAE:         " + res.get("CAE"));         // CAE asignado a la Factura
System.out.println("Vencimiento: " + res.get("CAEFchVto"));   // Fecha de vencimiento del CAE
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq" : {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 1
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 80,
                    "DocNro": 33693450239,
                    "CbteDesde": 483,
                    "CbteHasta": 483,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": null,
                    "ImpTotal": 121,
                    "ImpTotConc": 0,
                    "ImpNeto": 100,
                    "ImpOpEx": 0,
                    "ImpIVA": 21,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 1,
                    "Iva": {
                        "AlicIva": [
                            {
                                "Id": 5,
                                "BaseImp": 100,
                                "Importe": 21
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Factura B

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_factura = 6; // 6 = Factura B
	
	/**
	 * Número de la ultima Factura B
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura);

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 99;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 0;

	/**
	 * Numero de factura
	 **/
	const numero_de_factura = last_voucher+1;

	/**
	 * Fecha de la factura en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe sujeto al IVA (sin icluir IVA)
	 **/
	const importe_gravado = 100;

	/**
	 * Importe exento al IVA
	 **/
	const importe_exento_iva = 0;

	/**
	 * Importe de IVA
	 **/
	const importe_iva = 21;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 5;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	
	let fecha_servicio_desde = null, fecha_servicio_hasta = null, fecha_vencimiento_pago = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;

		/**
		 * Fecha de vencimiento del pago en formato aaaammdd
		 **/
		const fecha_vencimiento_pago = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de facturas a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_factura, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_factura,
		'CbteHasta' : numero_de_factura,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : fecha_vencimiento_pago,
		'ImpTotal' 	: importe_gravado + importe_iva + importe_exento_iva,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_gravado,
		'ImpOpEx' 	: importe_exento_iva,
		'ImpIVA' 	: importe_iva,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada en la factura ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos)  
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'Iva' 		: [ // Alícuotas asociadas a la factura
			{
				'Id' 		: 5, // Id del tipo de IVA (5 = 21%)
				'BaseImp' 	: importe_gravado,
				'Importe' 	: importe_iva 
			}
		]
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de factura
 **/
$tipo_de_factura = 6; // 6 = Factura B

/**
 * Número de la ultima Factura B
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_factura);

/**
 * Concepto de la factura
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 99;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 0;

/**
 * Numero de factura
 **/
$numero_de_factura = $last_voucher+1;

/**
 * Fecha de la factura en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Importe sujeto al IVA (sin icluir IVA)
 **/
$importe_gravado = 100;

/**
 * Importe exento al IVA
 **/
$importe_exento_iva = 0;

/**
 * Importe de IVA
 **/
$importe_iva = 21;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 5;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));

	/**
	 * Fecha de vencimiento del pago en formato aaaammdd
	 **/
	$fecha_vencimiento_pago = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
	$fecha_vencimiento_pago = null;
}

$data = array(
	'CantReg' 	=> 1, // Cantidad de facturas a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_factura, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_factura,
	'CbteHasta' => $numero_de_factura,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => $fecha_vencimiento_pago,
	'ImpTotal' 	=> $importe_gravado + $importe_iva + $importe_exento_iva,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_gravado,
	'ImpOpEx' 	=> $importe_exento_iva,
	'ImpIVA' 	=> $importe_iva,
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en la factura ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)  
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'Iva' 		=> array(// Alícuotas asociadas al factura
		array(
			'Id' 		=> 5, // Id del tipo de IVA (5 = 21%)
			'BaseImp' 	=> $importe_gravado,
			'Importe' 	=> $importe_iva 
		)
	), 
);

/** 
 * Creamos la Factura 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Factura 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Factura
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_factura = 6 # 6 = Factura B

# Número de la ultima Factura B
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura)

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 99

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 0

# Numero de factura
numero_de_factura = last_voucher+1

# Fecha de la factura en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 5

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
		# Fecha de inicio de servicio en formato aaaammdd
		fecha_servicio_desde = Time.now.strftime("%Y%m%d").to_i

		# Fecha de fin de servicio en formato aaaammdd
		fecha_servicio_hasta = Time.now.strftime("%Y%m%d").to_i

		# Fecha de vencimiento del pago en formato aaaammdd
		fecha_vencimiento_pago = Time.now.strftime("%Y%m%d").to_i
else
	fecha_servicio_desde = nil
	fecha_servicio_hasta = nil
	fecha_vencimiento_pago = nil
end

data = {
	"CantReg": 1, # Cantidad de facturas a registrar
	"PtoVta": punto_de_venta,
	"CbteTipo": tipo_de_factura, 
	"Concepto": concepto,
	"DocTipo": tipo_de_documento,
	"DocNro": numero_de_documento,
	"CbteDesde": numero_de_factura,
	"CbteHasta": numero_de_factura,
	"CbteFch": fecha,
	"FchServDesde": fecha_servicio_desde,
	"FchServHasta": fecha_servicio_hasta,
	"FchVtoPago": fecha_vencimiento_pago,
	"ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
	"ImpTotConc": 0, # Importe neto no gravado
	"ImpNeto": importe_gravado,
	"ImpOpEx": importe_exento_iva,
	"ImpIVA": importe_iva,
	"ImpTrib": 0, # Importe total de tributos
	"MonId": "PES", # Tipo de moneda usada en la factura ("PES" = pesos argentinos) 
	"MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos)  
	"CondicionIVAReceptorId" : condicion_iva_receptor, 
	"Iva": [ # Alícuotas asociadas al factura
		{
			"Id": 5, # Id del tipo de IVA (5 = 21%)
			"BaseImp": importe_gravado,
			"Importe": importe_iva 
    }
  ] 
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
puts {
	"cae": res["CAE"], # CAE asignado a la Factura
	"vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_factura = 6 # 6 = Factura B

# Número de la ultima Factura B
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura)

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 99

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 0

# Numero de factura
numero_de_factura = last_voucher+1

# Fecha de la factura en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 5

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
	# Fecha de inicio de servicio en formato aaaammdd
	fecha_servicio_desde = int(datetime.today().strftime("%Y%m%d"))

	# Fecha de fin de servicio en formato aaaammdd
	fecha_servicio_hasta = int(datetime.today().strftime("%Y%m%d"))

	# Fecha de vencimiento del pago en formato aaaammdd
	fecha_vencimiento_pago = int(datetime.today().strftime("%Y%m%d"))
else:
	fecha_servicio_desde = None
	fecha_servicio_hasta = None
	fecha_vencimiento_pago = None

data = {
	"CantReg": 1, # Cantidad de facturas a registrar
	"PtoVta": punto_de_venta,
	"CbteTipo": tipo_de_factura, 
	"Concepto": concepto,
	"DocTipo": tipo_de_documento,
	"DocNro": numero_de_documento,
	"CbteDesde": numero_de_factura,
	"CbteHasta": numero_de_factura,
	"CbteFch": fecha,
	"FchServDesde": fecha_servicio_desde,
	"FchServHasta": fecha_servicio_hasta,
	"FchVtoPago": fecha_vencimiento_pago,
	"ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
	"ImpTotConc": 0, # Importe neto no gravado
	"ImpNeto": importe_gravado,
	"ImpOpEx": importe_exento_iva,
	"ImpIVA": importe_iva,
	"ImpTrib": 0, # Importe total de tributos
	"MonId": "PES", # Tipo de moneda usada en la factura ("PES" = pesos argentinos) 
	"MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos)  
	"CondicionIVAReceptorId" : condicion_iva_receptor, 
	"Iva": [ # Alícuotas asociadas al factura
		{
			"Id": 5, # Id del tipo de IVA (5 = 21%)
			"BaseImp": importe_gravado,
			"Importe": importe_iva 
    		}
  	] 
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
print({
	"cae": res["CAE"], # CAE asignado a la Factura
	"vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de factura (6 = Factura B)
int tipoDeFactura = 6;

// Número de la ultima Factura B
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeFactura);

// Concepto de la factura
// 1 = Productos
// 2 = Servicios
// 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento del comprador
// 80 = CUIT
// 86 = CUIL
// 96 = DNI
// 99 = Consumidor Final
int tipoDeDocumento = 99;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 0;

// Numero de factura
int numeroDeFactura = lastVoucher + 1;

// Fecha de la factura en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe sujeto al IVA (sin incluir IVA)
decimal importeGravado = 100;

// Importe exento al IVA
decimal importeExentoIva = 0;

// Importe de IVA
decimal importeIva = 21;

// Condición frente al IVA del receptor
// 1  = IVA Responsable Inscripto
// 4  = IVA Sujeto Exento
// 5  = Consumidor Final
// 6  = Responsable Monotributo
// 7  = Sujeto No Categorizado
// 8  = Proveedor del Exterior
// 9  = Cliente del Exterior
// 10 = IVA Liberado – Ley N° 19.640
// 13 = Monotributista Social
// 15 = IVA No Alcanzado
// 16 = Monotributo Trabajador Independiente Promovido
int condicionIvaReceptor = 5;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3)
{
    // Fecha de inicio de servicio en formato aaaammdd
    fechaServicioDesde = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

    // Fecha de fin de servicio en formato aaaammdd
    fechaServicioHasta = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

    // Fecha de vencimiento del pago en formato aaaammdd
    fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },                                            // Cantidad de facturas a registrar
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeFactura },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeFactura },
    { "CbteHasta",              numeroDeFactura },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeGravado + importeIva + importeExentoIva },
    { "ImpTotConc",             0 },                                            // Importe neto no gravado
    { "ImpNeto",                importeGravado },
    { "ImpOpEx",                importeExentoIva },
    { "ImpIVA",                 importeIva },
    { "ImpTrib",                0 },                                            // Importe total de tributos
    { "MonId",                  "PES" },                                        // Tipo de moneda ('PES' = pesos argentinos)
    { "MonCotiz",               1 },                                            // Cotización de la moneda (1 para pesos argentinos)
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "Iva", new List<Dictionary<string, object?>>                              // Alícuotas asociadas a la factura
        {
            new Dictionary<string, object?>
            {
                { "Id",      5 },                // Id del tipo de IVA (5 = 21%)
                { "BaseImp", importeGravado },
                { "Importe", importeIva }
            }
        }
    }
};

// Creamos la Factura
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

// Mostramos por pantalla los datos de la nueva Factura
Console.WriteLine($"CAE: {res["CAE"]}");                // CAE asignado a la Factura
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");  // Fecha de vencimiento del CAE
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de factura (6 = Factura B)
int tipoDeFactura = 6;

// Número de la ultima Factura B
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeFactura);

// Concepto de la factura
// 1 = Productos
// 2 = Servicios
// 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento del comprador
// 80 = CUIT
// 86 = CUIL
// 96 = DNI
// 99 = Consumidor Final
int tipoDeDocumento = 99;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 0;

// Numero de factura
int numeroDeFactura = lastVoucher + 1;

// Fecha de la factura en formato aaaammdd
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe sujeto al IVA (sin incluir IVA)
double importeGravado = 100.0;

// Importe exento al IVA
double importeExentoIva = 0;

// Importe de IVA
double importeIva = 21.0;

// Condición frente al IVA del receptor
// 1  = IVA Responsable Inscripto
// 4  = IVA Sujeto Exento
// 5  = Consumidor Final
// 6  = Responsable Monotributo
// 7  = Sujeto No Categorizado
// 8  = Proveedor del Exterior
// 9  = Cliente del Exterior
// 10 = IVA Liberado – Ley N° 19.640
// 13 = Monotributista Social
// 15 = IVA No Alcanzado
// 16 = Monotributo Trabajador Independiente Promovido
int condicionIvaReceptor = 5;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3) {
    // Fecha de inicio de servicio en formato aaaammdd
    fechaServicioDesde = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

    // Fecha de fin de servicio en formato aaaammdd
    fechaServicioHasta = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

    // Fecha de vencimiento del pago en formato aaaammdd
    fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> alicuota = new HashMap<>();
alicuota.put("Id", 5); // Id del tipo de IVA (5 = 21%)
alicuota.put("BaseImp", importeGravado);
alicuota.put("Importe", importeIva);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);                                          // Cantidad de facturas a registrar
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeFactura);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeFactura);
data.put("CbteHasta",             numeroDeFactura);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeGravado + importeIva + importeExentoIva);
data.put("ImpTotConc",            0);                                          // Importe neto no gravado
data.put("ImpNeto",               importeGravado);
data.put("ImpOpEx",               importeExentoIva);
data.put("ImpIVA",                importeIva);
data.put("ImpTrib",               0);                                          // Importe total de tributos
data.put("MonId",                 "PES");                                      // Tipo de moneda ('PES' = pesos argentinos)
data.put("MonCotiz",              1);                                          // Cotización de la moneda (1 para pesos argentinos)
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("Iva",                   Arrays.asList(alicuota));                    // Alícuotas asociadas a la factura

// Creamos la Factura
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

// Mostramos por pantalla los datos de la nueva Factura
System.out.println("CAE:         " + res.get("CAE"));         // CAE asignado a la Factura
System.out.println("Vencimiento: " + res.get("CAEFchVto"));   // Fecha de vencimiento del CAE
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq" : {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 6
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 99,
                    "DocNro": 0,
                    "CbteDesde": 865,
                    "CbteHasta": 865,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": null,
                    "ImpTotal": 121,
                    "ImpTotConc": 0,
                    "ImpNeto": 100,
                    "ImpOpEx": 0,
                    "ImpIVA": 21,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 5,
                    "Iva": {
                        "AlicIva": [
                            {
                                "Id": 5,
                                "BaseImp": 100,
                                "Importe": 21
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Factura C

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_factura = 11; // 11 = Factura C
	
	/**
	 * Número de la ultima Factura C
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura);

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 80;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 33693450239;

	/**
	 * Numero de factura
	 **/
	const numero_de_factura = last_voucher+1;

	/**
	 * Fecha de la factura en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe de la Factura
	 **/
	const importe_total = 100;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 6;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	let fecha_servicio_desde = null, fecha_servicio_hasta = null, fecha_vencimiento_pago = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;

		/**
		 * Fecha de vencimiento del pago en formato aaaammdd
		 **/
		const fecha_vencimiento_pago = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de facturas a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_factura, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_factura,
		'CbteHasta' : numero_de_factura,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : fecha_vencimiento_pago,
		'ImpTotal' 	: importe_total,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_total,
		'ImpOpEx' 	: 0,
		'ImpIVA' 	: 0,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada en la factura ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos)  
		'CondicionIVAReceptorId' : condicion_iva_receptor,
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de factura
 **/
$tipo_de_comprobante = 11; // 11 = Factura C

/**
 * Número de la ultima Factura C
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_comprobante);

/**
 * Concepto de la factura
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 80;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 33693450239;

/**
 * Numero de comprobante
 **/
$numero_de_factura = $last_voucher+1;

/**
 * Fecha de la factura en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Importe de la Factura
 **/
$importe_total = 100;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 6;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));

	/**
	 * Fecha de vencimiento del pago en formato aaaammdd
	 **/
	$fecha_vencimiento_pago = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
	$fecha_vencimiento_pago = null;
}


$data = array(
	'CantReg' 	=> 1, // Cantidad de facturas a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_comprobante, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_factura,
	'CbteHasta' => $numero_de_factura,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => $fecha_vencimiento_pago,
	'ImpTotal' 	=> $importe_total,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_total, // Importe neto
	'ImpOpEx' 	=> 0, // Importe exento al IVA
	'ImpIVA' 	=> 0, // Importe de IVA
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en la factura ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)  
	'CondicionIVAReceptorId' => $condicion_iva_receptor,
);

/** 
 * Creamos la Factura 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Factura 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Factura
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_factura = 11 # 11 = Factura c

# Número de la ultima Factura c
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura)

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de factura
numero_de_factura = last_voucher+1

# Fecha de la factura en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Importe de la Factura
importe_total = 100

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 6

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
		# Fecha de inicio de servicio en formato aaaammdd
		fecha_servicio_desde = Time.now.strftime("%Y%m%d").to_i

		# Fecha de fin de servicio en formato aaaammdd
		fecha_servicio_hasta = Time.now.strftime("%Y%m%d").to_i

		# Fecha de vencimiento del pago en formato aaaammdd
		fecha_vencimiento_pago = Time.now.strftime("%Y%m%d").to_i
else
	fecha_servicio_desde = nil
	fecha_servicio_hasta = nil
	fecha_vencimiento_pago = nil
end

data = {
	"CantReg": 1, # Cantidad de facturas a registrar
	"PtoVta": punto_de_venta,
	"CbteTipo": tipo_de_factura, 
	"Concepto": concepto,
	"DocTipo": tipo_de_documento,
	"DocNro": numero_de_documento,
	"CbteDesde": numero_de_factura,
	"CbteHasta": numero_de_factura,
	"CbteFch": fecha,
	"FchServDesde": fecha_servicio_desde,
	"FchServHasta": fecha_servicio_hasta,
	"FchVtoPago": fecha_vencimiento_pago,
	"ImpTotal": importe_total,
	"ImpTotConc": 0, # Importe neto no gravado
	"ImpNeto": importe_total,
	"ImpOpEx": 0,
	"ImpIVA": 0,
	"ImpTrib": 0, # Importe total de tributos
	"MonId": "PES", # Tipo de moneda usada en la factura ("PES" = pesos argentinos) 
	"MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos)  
	"CondicionIVAReceptorId" : condicion_iva_receptor
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
puts {
	"cae": res["CAE"], # CAE asignado a la Factura
	"vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_factura = 11 # 11 = Factura c

# Número de la ultima Factura c
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura)

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de factura
numero_de_factura = last_voucher+1

# Fecha de la factura en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Importe de la Factura
importe_total = 100

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 6

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
	# Fecha de inicio de servicio en formato aaaammdd
	fecha_servicio_desde = int(datetime.today().strftime("%Y%m%d"))

	# Fecha de fin de servicio en formato aaaammdd
	fecha_servicio_hasta = int(datetime.today().strftime("%Y%m%d"))

	# Fecha de vencimiento del pago en formato aaaammdd
	fecha_vencimiento_pago = int(datetime.today().strftime("%Y%m%d"))
else:
	fecha_servicio_desde = None
	fecha_servicio_hasta = None
	fecha_vencimiento_pago = None

data = {
	"CantReg": 1, # Cantidad de facturas a registrar
	"PtoVta": punto_de_venta,
	"CbteTipo": tipo_de_factura, 
	"Concepto": concepto,
	"DocTipo": tipo_de_documento,
	"DocNro": numero_de_documento,
	"CbteDesde": numero_de_factura,
	"CbteHasta": numero_de_factura,
	"CbteFch": fecha,
	"FchServDesde": fecha_servicio_desde,
	"FchServHasta": fecha_servicio_hasta,
	"FchVtoPago": fecha_vencimiento_pago,
	"ImpTotal": importe_total,
	"ImpTotConc": 0, # Importe neto no gravado
	"ImpNeto": importe_total,
	"ImpOpEx": 0,
	"ImpIVA": 0,
	"ImpTrib": 0, # Importe total de tributos
	"MonId": "PES", # Tipo de moneda usada en la factura ("PES" = pesos argentinos) 
	"MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos)  
	"CondicionIVAReceptorId" : condicion_iva_receptor
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
print({
	"cae": res["CAE"], # CAE asignado a la Factura
	"vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de factura (11 = Factura C)
int tipoDeFactura = 11;

// Número de la ultima Factura C
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeFactura);

// Concepto de la factura
// 1 = Productos
// 2 = Servicios
// 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento del comprador
// 80 = CUIT
// 86 = CUIL
// 96 = DNI
// 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239;

// Numero de factura
int numeroDeFactura = lastVoucher + 1;

// Fecha de la factura en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe de la Factura
decimal importeTotal = 100;

// Condición frente al IVA del receptor
// 1  = IVA Responsable Inscripto
// 4  = IVA Sujeto Exento
// 5  = Consumidor Final
// 6  = Responsable Monotributo
// 7  = Sujeto No Categorizado
// 8  = Proveedor del Exterior
// 9  = Cliente del Exterior
// 10 = IVA Liberado – Ley N° 19.640
// 13 = Monotributista Social
// 15 = IVA No Alcanzado
// 16 = Monotributo Trabajador Independiente Promovido
int condicionIvaReceptor = 6;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3)
{
    // Fecha de inicio de servicio en formato aaaammdd
    fechaServicioDesde = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

    // Fecha de fin de servicio en formato aaaammdd
    fechaServicioHasta = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

    // Fecha de vencimiento del pago en formato aaaammdd
    fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },                // Cantidad de facturas a registrar
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeFactura },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeFactura },
    { "CbteHasta",              numeroDeFactura },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeTotal },
    { "ImpTotConc",             0 },                // Importe neto no gravado
    { "ImpNeto",                importeTotal },
    { "ImpOpEx",                0 },
    { "ImpIVA",                 0 },
    { "ImpTrib",                0 },                // Importe total de tributos
    { "MonId",                  "PES" },            // Tipo de moneda ('PES' = pesos argentinos)
    { "MonCotiz",               1 },                // Cotización de la moneda (1 para pesos argentinos)
    { "CondicionIVAReceptorId", condicionIvaReceptor }
};

// Creamos la Factura
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

// Mostramos por pantalla los datos de la nueva Factura
Console.WriteLine($"CAE: {res["CAE"]}");                // CAE asignado a la Factura
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");  // Fecha de vencimiento del CAE
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de factura (11 = Factura C)
int tipoDeFactura = 11;

// Número de la ultima Factura C
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeFactura);

// Concepto de la factura
// 1 = Productos
// 2 = Servicios
// 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento del comprador
// 80 = CUIT
// 86 = CUIL
// 96 = DNI
// 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239L;

// Numero de factura
int numeroDeFactura = lastVoucher + 1;

// Fecha de la factura en formato aaaammdd
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe de la Factura
double importeTotal = 100.0;

// Condición frente al IVA del receptor
// 1  = IVA Responsable Inscripto
// 4  = IVA Sujeto Exento
// 5  = Consumidor Final
// 6  = Responsable Monotributo
// 7  = Sujeto No Categorizado
// 8  = Proveedor del Exterior
// 9  = Cliente del Exterior
// 10 = IVA Liberado – Ley N° 19.640
// 13 = Monotributista Social
// 15 = IVA No Alcanzado
// 16 = Monotributo Trabajador Independiente Promovido
int condicionIvaReceptor = 6;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3) {
    // Fecha de inicio de servicio en formato aaaammdd
    fechaServicioDesde = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

    // Fecha de fin de servicio en formato aaaammdd
    fechaServicioHasta = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

    // Fecha de vencimiento del pago en formato aaaammdd
    fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);                // Cantidad de facturas a registrar
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeFactura);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeFactura);
data.put("CbteHasta",             numeroDeFactura);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeTotal);
data.put("ImpTotConc",            0);                // Importe neto no gravado
data.put("ImpNeto",               importeTotal);
data.put("ImpOpEx",               0);
data.put("ImpIVA",                0);
data.put("ImpTrib",               0);                // Importe total de tributos
data.put("MonId",                 "PES");            // Tipo de moneda ('PES' = pesos argentinos)
data.put("MonCotiz",              1);                // Cotización de la moneda (1 para pesos argentinos)
data.put("CondicionIVAReceptorId", condicionIvaReceptor);

// Creamos la Factura
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

// Mostramos por pantalla los datos de la nueva Factura
System.out.println("CAE:         " + res.get("CAE"));         // CAE asignado a la Factura
System.out.println("Vencimiento: " + res.get("CAEFchVto"));   // Fecha de vencimiento del CAE
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth" : { 
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq" : {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 11
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 80,
                    "DocNro": 33693450239,
                    "CbteDesde": 327,
                    "CbteHasta": 327,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": null,
                    "ImpTotal": 100,
                    "ImpTotConc": 0,
                    "ImpNeto": 100,
                    "ImpOpEx": 0,
                    "ImpIVA": 0,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 6
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Nota de Crédito A

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_nota = 3; // 3 = Nota de Crédito A
	
	/**
	 * Número de la ultima Nota de Crédito A
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota);

	/**
	 * Numero del punto de venta de la Factura 
	 * asociada a la Nota de Crédito
	 **/
	const punto_factura_asociada = 1;

	/**
	 * Tipo de Factura asociada a la Nota de Crédito
	 **/
	const tipo_factura_asociada = 1; // 1 = Factura A

	/**
	 * Numero de Factura asociada a la Nota de Crédito
	 **/
	const numero_factura_asociada = 1;

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 80;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 33693450239;

	/**
	 * Numero de Nota de Crédito
	 **/
	const numero_de_nota = last_voucher+1;

	/**
	 * Fecha de la Nota de Crédito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe sujeto al IVA (sin icluir IVA)
	 **/
	const importe_gravado = 100;

	/**
	 * Importe exento al IVA
	 **/
	const importe_exento_iva = 0;

	/**
	 * Importe de IVA
	 **/
	const importe_iva = 21;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 1;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	let fecha_servicio_desde = null, fecha_servicio_hasta = null, fecha_vencimiento_pago = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;

		/**
		 * Fecha de vencimiento del pago en formato aaaammdd
		 **/
		const fecha_vencimiento_pago = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de Notas de Crédito a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_nota, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_nota,
		'CbteHasta' : numero_de_nota,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : fecha_vencimiento_pago,
		'ImpTotal' 	: importe_gravado + importe_iva + importe_exento_iva,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_gravado,
		'ImpOpEx' 	: importe_exento_iva,
		'ImpIVA' 	: importe_iva,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos) 
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'CbtesAsoc' : [ //Factura asociada
			{
				'Tipo' 		: tipo_factura_asociada,
				'PtoVta' 	: punto_factura_asociada,
				'Nro' 		: numero_factura_asociada,
			}
		],
		'Iva' 		: [ // Alícuotas asociadas a la Nota de Crédito
			{
				'Id' 		: 5, // Id del tipo de IVA (5 = 21%)
				'BaseImp' 	: importe_gravado,
				'Importe' 	: importe_iva 
			}
		]
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de Nota de Crédito
 **/
$tipo_de_nota = 3; // 3 = Nota de Crédito A

/**
 * Número de la ultima Nota de Crédito A
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_nota);

/**
 * Numero del punto de venta de la Factura 
 * asociada a la Nota de Crédito
 **/
$punto_factura_asociada = 1;

/**
 * Tipo de Factura asociada a la Nota de Crédito
 **/
$tipo_factura_asociada = 1; // 1 = Factura A

/**
 * Numero de Factura asociada a la Nota de Crédito
 **/
$numero_factura_asociada = 1;

/**
 * Concepto de la Nota de Crédito
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 80;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 33693450239;

/**
 * Numero de Nota de Crédito
 **/
$numero_de_nota = $last_voucher+1;

/**
 * Fecha de la Nota de Crédito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Importe sujeto al IVA (sin icluir IVA)
 **/
$importe_gravado = 100;

/**
 * Importe exento al IVA
 **/
$importe_exento_iva = 0;

/**
 * Importe de IVA
 **/
$importe_iva = 21;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 1;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));

	/**
	 * Fecha de vencimiento del pago en formato aaaammdd
	 **/
	$fecha_vencimiento_pago = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
	$fecha_vencimiento_pago = null;
}

$data = array(
	'CantReg' 	=> 1, // Cantidad de Notas de Crédito a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_nota, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_nota,
	'CbteHasta' => $numero_de_nota,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => $fecha_vencimiento_pago,
	'ImpTotal' 	=> $importe_gravado + $importe_iva + $importe_exento_iva,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_gravado,
	'ImpOpEx' 	=> $importe_exento_iva,
	'ImpIVA' 	=> $importe_iva,
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en la Nota de Crédito ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'CbtesAsoc' => array( //Factura asociada
		array(
			'Tipo' 		=> $tipo_factura_asociada,
			'PtoVta' 	=> $punto_factura_asociada,
			'Nro' 		=> $numero_factura_asociada,
		)
	),
	'Iva' 		=> array( // Alícuotas asociadas a la Nota de Crédito
		array(
			'Id' 		=> 5, // Id del tipo de IVA (5 = 21%)
			'BaseImp' 	=> $importe_gravado,
			'Importe' 	=> $importe_iva 
		)
	), 
);

/** 
 * Creamos la Nota de Crédito 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Nota de Crédito 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Nota de Crédito
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}
{% code fullWidth="false" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 3 # 3 = Nota de Crédito A

# Número de la ultima Nota de Crédito A
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Crédito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Crédito
tipo_factura_asociada = 1 # 1 = Factura A

# Numero de Factura asociada a la Nota de Crédito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de Nota de Crédito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Crédito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 1

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else 
  fecha_servicio_desde = nil
  fecha_servicio_hasta = nil
  fecha_vencimiento_pago = nil
end

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ],
  "Iva": [ # Alícuotas asociadas a la Nota de Crédito
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
puts {
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endcode %}
{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 3 # 3 = Nota de Crédito A

# Número de la ultima Nota de Crédito A
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Crédito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Crédito
tipo_factura_asociada = 1 # 1 = Factura A

# Numero de Factura asociada a la Nota de Crédito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de Nota de Crédito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Crédito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 1

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else:
  fecha_servicio_desde = None
  fecha_servicio_hasta = None
  fecha_vencimiento_pago = None

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ],
  "Iva": [ # Alícuotas asociadas a la Nota de Crédito
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
print({
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de nota (3 = Nota de Crédito A)
int tipoDeLaNota = 3;

// Número de la ultima Nota de Crédito A
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada a la Nota de Crédito
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (1 = Factura A)
int tipoFacturaAsociada = 1;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239;

// Numero de Nota de Crédito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe sujeto al IVA (sin incluir IVA)
decimal importeGravado = 100;

// Importe exento al IVA
decimal importeExentoIva = 0;

// Importe de IVA
decimal importeIva = 21;

// Condición frente al IVA del receptor
// 1=IVA Resp. Inscripto, 4=Exento, 5=CF, 6=Monotributo, ...
int condicionIvaReceptor = 1;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3)
{
    fechaServicioDesde  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaServicioHasta  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },                    // Cantidad de Notas de Crédito a registrar
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeLaNota },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeLaNota },
    { "CbteHasta",              numeroDeLaNota },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeGravado + importeIva + importeExentoIva },
    { "ImpTotConc",             0 },                    // Importe neto no gravado
    { "ImpNeto",                importeGravado },
    { "ImpOpEx",                importeExentoIva },
    { "ImpIVA",                 importeIva },
    { "ImpTrib",                0 },                    // Importe total de tributos
    { "MonId",                  "PES" },                // Tipo de moneda ('PES' = pesos argentinos)
    { "MonCotiz",               1 },                    // Cotización de la moneda (1 para pesos argentinos)
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "CbtesAsoc", new List<Dictionary<string, object?>> // Factura asociada
        {
            new Dictionary<string, object?>
            {
                { "Tipo",   tipoFacturaAsociada },
                { "PtoVta", puntoFacturaAsociada },
                { "Nro",    numeroFacturaAsociada }
            }
        }
    },
    { "Iva", new List<Dictionary<string, object?>>      // Alícuotas asociadas a la Nota de Crédito
        {
            new Dictionary<string, object?>
            {
                { "Id",      5 },                       // Id del tipo de IVA (5 = 21%)
                { "BaseImp", importeGravado },
                { "Importe", importeIva }
            }
        }
    }
};

// Creamos la Nota de Crédito
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

// Mostramos por pantalla los datos de la nueva Nota de Crédito
Console.WriteLine($"CAE: {res["CAE"]}");                // CAE asignado a la Nota de Crédito
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");  // Fecha de vencimiento del CAE
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de nota (3 = Nota de Crédito A)
int tipoDeLaNota = 3;

// Número de la ultima Nota de Crédito A
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada a la Nota de Crédito
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (1 = Factura A)
int tipoFacturaAsociada = 1;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239L;

// Numero de Nota de Crédito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe sujeto al IVA (sin incluir IVA)
double importeGravado = 100.0;

// Importe exento al IVA
double importeExentoIva = 0;

// Importe de IVA
double importeIva = 21.0;

// Condición frente al IVA del receptor
// 1=IVA Resp. Inscripto, 4=Exento, 5=CF, 6=Monotributo, ...
int condicionIvaReceptor = 1;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3) {
    fechaServicioDesde  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaServicioHasta  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> facturaAsociada = new HashMap<>();
facturaAsociada.put("Tipo",   tipoFacturaAsociada);
facturaAsociada.put("PtoVta", puntoFacturaAsociada);
facturaAsociada.put("Nro",    numeroFacturaAsociada);

Map<String, Object> alicuota = new HashMap<>();
alicuota.put("Id",      5); // Id del tipo de IVA (5 = 21%)
alicuota.put("BaseImp", importeGravado);
alicuota.put("Importe", importeIva);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);                    // Cantidad de Notas de Crédito a registrar
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeLaNota);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeLaNota);
data.put("CbteHasta",             numeroDeLaNota);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeGravado + importeIva + importeExentoIva);
data.put("ImpTotConc",            0);                    // Importe neto no gravado
data.put("ImpNeto",               importeGravado);
data.put("ImpOpEx",               importeExentoIva);
data.put("ImpIVA",                importeIva);
data.put("ImpTrib",               0);                    // Importe total de tributos
data.put("MonId",                 "PES");                // Tipo de moneda ('PES' = pesos argentinos)
data.put("MonCotiz",              1);                    // Cotización de la moneda (1 para pesos argentinos)
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("CbtesAsoc",             Arrays.asList(facturaAsociada)); // Factura asociada
data.put("Iva",                   Arrays.asList(alicuota));        // Alícuotas asociadas a la Nota de Crédito

// Creamos la Nota de Crédito
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

// Mostramos por pantalla los datos de la nueva Nota de Crédito
System.out.println("CAE:         " + res.get("CAE"));         // CAE asignado a la Nota de Crédito
System.out.println("Vencimiento: " + res.get("CAEFchVto"));   // Fecha de vencimiento del CAE
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq": {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 3
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 80,
                    "DocNro": 33693450239,
                    "CbteDesde": 30,
                    "CbteHasta": 30,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": null,
                    "ImpTotal": 121,
                    "ImpTotConc": 0,
                    "ImpNeto": 100,
                    "ImpOpEx": 0,
                    "ImpIVA": 21,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 1,
                    "CbtesAsoc": {
                        "CbteAsoc": [
                            {
                                "Tipo": 1,
                                "PtoVta": 1,
                                "Nro": 1
                            }
                        ]
                    },
                    "Iva": {
                        "AlicIva": [
                            {
                                "Id": 5,
                                "BaseImp": 100,
                                "Importe": 21
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Nota de Crédito B

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_nota = 8; // 8 = Nota de Crédito B
	
	/**
	 * Número de la ultima Nota de Crédito B
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota);

	/**
	 * Numero del punto de venta de la Factura 
	 * asociada a la Nota de Crédito
	 **/
	const punto_factura_asociada = 1;

	/**
	 * Tipo de Factura asociada a la Nota de Crédito
	 **/
	const tipo_factura_asociada = 6; // 6 = Factura B

	/**
	 * Numero de Factura asociada a la Nota de Crédito
	 **/
	const numero_factura_asociada = 1;

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 99;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 0;

	/**
	 * Numero de Nota de Crédito
	 **/
	const numero_de_nota = last_voucher+1;

	/**
	 * Fecha de la Nota de Crédito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe sujeto al IVA (sin icluir IVA)
	 **/
	const importe_gravado = 100;

	/**
	 * Importe exento al IVA
	 **/
	const importe_exento_iva = 0;

	/**
	 * Importe de IVA
	 **/
	const importe_iva = 21;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 5;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	let fecha_servicio_desde = null, fecha_servicio_hasta = null, fecha_vencimiento_pago = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;

		/**
		 * Fecha de vencimiento del pago en formato aaaammdd
		 **/
		const fecha_vencimiento_pago = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de Notas de Crédito a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_nota, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_nota,
		'CbteHasta' : numero_de_nota,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : fecha_vencimiento_pago,
		'ImpTotal' 	: importe_gravado + importe_iva + importe_exento_iva,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_gravado,
		'ImpOpEx' 	: importe_exento_iva,
		'ImpIVA' 	: importe_iva,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos) 
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'CbtesAsoc' : [ //Factura asociada
			{
				'Tipo' 		: tipo_factura_asociada,
				'PtoVta' 	: punto_factura_asociada,
				'Nro' 		: numero_factura_asociada,
			}
		],
		'Iva' 		: [ // Alícuotas asociadas a la Nota de Crédito
			{
				'Id' 		: 5, // Id del tipo de IVA (5 = 21%)
				'BaseImp' 	: importe_gravado,
				'Importe' 	: importe_iva 
			}
		]
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de Nota de Crédito
 **/
$tipo_de_nota = 8; // 8 = Nota de Crédito B

/**
 * Número de la ultima Nota de Crédito B
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_nota);

/**
 * Numero del punto de venta de la Factura 
 * asociada a la Nota de Crédito
 **/
$punto_factura_asociada = 1;

/**
 * Tipo de Factura asociada a la Nota de Crédito
 **/
$tipo_factura_asociada = 6; // 6 = Factura B

/**
 * Numero de Factura asociada a la Nota de Crédito
 **/
$numero_factura_asociada = 1;

/**
 * Concepto de la Nota de Crédito
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 99;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 0;

/**
 * Numero de Nota de Crédito
 **/
$numero_de_nota = $last_voucher+1;

/**
 * Fecha de la Nota de Crédito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Importe sujeto al IVA (sin icluir IVA)
 **/
$importe_gravado = 100;

/**
 * Importe exento al IVA
 **/
$importe_exento_iva = 0;

/**
 * Importe de IVA
 **/
$importe_iva = 21;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 5;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));

	/**
	 * Fecha de vencimiento del pago en formato aaaammdd
	 **/
	$fecha_vencimiento_pago = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
	$fecha_vencimiento_pago = null;
}


$data = array(
	'CantReg' 	=> 1, // Cantidad de Notas de Crédito a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_nota, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_nota,
	'CbteHasta' => $numero_de_nota,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => $fecha_vencimiento_pago,
	'ImpTotal' 	=> $importe_gravado + $importe_iva + $importe_exento_iva,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_gravado,
	'ImpOpEx' 	=> $importe_exento_iva,
	'ImpIVA' 	=> $importe_iva,
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en la Nota de Crédito ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)  
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'CbtesAsoc' => array( //Factura asociada
		array(
			'Tipo' 		=> $tipo_factura_asociada,
			'PtoVta' 	=> $punto_factura_asociada,
			'Nro' 		=> $numero_factura_asociada,
		)
	),
	'Iva' 		=> array(// Alícuotas asociadas a la Nota de Crédito
		array(
			'Id' 		=> 5, // Id del tipo de IVA (5 = 21%)
			'BaseImp' 	=> $importe_gravado,
			'Importe' 	=> $importe_iva 
		)
	), 
);

/** 
 * Creamos la Nota de Crédito 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Nota de Crédito 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Nota de Crédito
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 8 # 8 = Nota de Crédito B

# Número de la ultima Nota de Crédito B
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Crédito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Crédito
tipo_factura_asociada = 6 # 6 = Factura B

# Numero de Factura asociada a la Nota de Crédito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 99

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 0

# Numero de Nota de Crédito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Crédito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 5

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else 
  fecha_servicio_desde = nil
  fecha_servicio_hasta = nil
  fecha_vencimiento_pago = nil
end

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ],
  "Iva": [ # Alícuotas asociadas a la Nota de Crédito
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
puts {
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 8 # 8 = Nota de Crédito B

# Número de la ultima Nota de Crédito B
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Crédito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Crédito
tipo_factura_asociada = 6 # 6 = Factura B

# Numero de Factura asociada a la Nota de Crédito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 99

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 0

# Numero de Nota de Crédito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Crédito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 5

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else:
  fecha_servicio_desde = None
  fecha_servicio_hasta = None
  fecha_vencimiento_pago = None

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ],
  "Iva": [ # Alícuotas asociadas a la Nota de Crédito
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
print({
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de nota (8 = Nota de Crédito B)
int tipoDeLaNota = 8;

// Número de la ultima Nota de Crédito B
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada a la Nota de Crédito
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (6 = Factura B)
int tipoFacturaAsociada = 6;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 99;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 0;

// Numero de Nota de Crédito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe sujeto al IVA (sin incluir IVA)
decimal importeGravado = 100;

// Importe exento al IVA
decimal importeExentoIva = 0;

// Importe de IVA
decimal importeIva = 21;

// Condición frente al IVA del receptor
// 1=IVA Resp. Inscripto, 4=Exento, 5=CF, 6=Monotributo, ...
int condicionIvaReceptor = 5;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3)
{
    fechaServicioDesde  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaServicioHasta  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeLaNota },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeLaNota },
    { "CbteHasta",              numeroDeLaNota },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeGravado + importeIva + importeExentoIva },
    { "ImpTotConc",             0 },
    { "ImpNeto",                importeGravado },
    { "ImpOpEx",                importeExentoIva },
    { "ImpIVA",                 importeIva },
    { "ImpTrib",                0 },
    { "MonId",                  "PES" },
    { "MonCotiz",               1 },
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "CbtesAsoc", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Tipo",   tipoFacturaAsociada },
                { "PtoVta", puntoFacturaAsociada },
                { "Nro",    numeroFacturaAsociada }
            }
        }
    },
    { "Iva", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Id",      5 },
                { "BaseImp", importeGravado },
                { "Importe", importeIva }
            }
        }
    }
};

// Creamos la Nota de Crédito
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

Console.WriteLine($"CAE: {res["CAE"]}");
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de nota (8 = Nota de Crédito B)
int tipoDeLaNota = 8;

// Número de la ultima Nota de Crédito B
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada a la Nota de Crédito
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (6 = Factura B)
int tipoFacturaAsociada = 6;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 99;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 0;

// Numero de Nota de Crédito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe sujeto al IVA (sin incluir IVA)
double importeGravado = 100.0;

// Importe exento al IVA
double importeExentoIva = 0;

// Importe de IVA
double importeIva = 21.0;

// Condición frente al IVA del receptor
// 1=IVA Resp. Inscripto, 4=Exento, 5=CF, 6=Monotributo, ...
int condicionIvaReceptor = 5;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3) {
    fechaServicioDesde  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaServicioHasta  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> facturaAsociada = new HashMap<>();
facturaAsociada.put("Tipo",   tipoFacturaAsociada);
facturaAsociada.put("PtoVta", puntoFacturaAsociada);
facturaAsociada.put("Nro",    numeroFacturaAsociada);

Map<String, Object> alicuota = new HashMap<>();
alicuota.put("Id",      5);
alicuota.put("BaseImp", importeGravado);
alicuota.put("Importe", importeIva);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeLaNota);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeLaNota);
data.put("CbteHasta",             numeroDeLaNota);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeGravado + importeIva + importeExentoIva);
data.put("ImpTotConc",            0);
data.put("ImpNeto",               importeGravado);
data.put("ImpOpEx",               importeExentoIva);
data.put("ImpIVA",                importeIva);
data.put("ImpTrib",               0);
data.put("MonId",                 "PES");
data.put("MonCotiz",              1);
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("CbtesAsoc",             Arrays.asList(facturaAsociada));
data.put("Iva",                   Arrays.asList(alicuota));

// Creamos la Nota de Crédito
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

System.out.println("CAE:         " + res.get("CAE"));
System.out.println("Vencimiento: " + res.get("CAEFchVto"));
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq": {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 8
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 99,
                    "DocNro": 0,
                    "CbteDesde": 15,
                    "CbteHasta": 15,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": null,
                    "ImpTotal": 121,
                    "ImpTotConc": 0,
                    "ImpNeto": 100,
                    "ImpOpEx": 0,
                    "ImpIVA": 21,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 5,
                    "CbtesAsoc": {
                        "CbteAsoc": [
                            {
                                "Tipo": 6,
                                "PtoVta": 1,
                                "Nro": 1
                            }
                        ]
                    },
                    "Iva": {
                        "AlicIva": [
                            {
                                "Id": 5,
                                "BaseImp": 100,
                                "Importe": 21
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Nota de Crédito C

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_nota = 13; // 13 = Nota de Crédito C
	
	/**
	 * Número de la ultima Nota de Crédito C
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota);

	/**
	 * Numero del punto de venta de la Factura 
	 * asociada a la Nota de Crédito
	 **/
	const punto_factura_asociada = 1;

	/**
	 * Tipo de Factura asociada a la Nota de Crédito
	 **/
	const tipo_factura_asociada = 11; // 11 = Factura C

	/**
	 * Numero de Factura asociada a la Nota de Crédito
	 **/
	const numero_factura_asociada = 1;

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 80;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 33693450239;

	/**
	 * Numero de Nota de Crédito
	 **/
	const numero_de_nota = last_voucher+1;

	/**
	 * Fecha de la Nota de Crédito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe de la Nota de Crédito
	 **/
	const importe_total = 100;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 6;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	let fecha_servicio_desde = null, fecha_servicio_hasta = null, fecha_vencimiento_pago = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;

		/**
		 * Fecha de vencimiento del pago en formato aaaammdd
		 **/
		const fecha_vencimiento_pago = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de Notas de Crédito a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_nota, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_nota,
		'CbteHasta' : numero_de_nota,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : fecha_vencimiento_pago,
		'ImpTotal' 	: importe_total,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_total,
		'ImpOpEx' 	: 0,
		'ImpIVA' 	: 0,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos) 
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'CbtesAsoc' : [ //Factura asociada
			{
				'Tipo' 		: tipo_factura_asociada,
				'PtoVta' 	: punto_factura_asociada,
				'Nro' 		: numero_factura_asociada,
			}
		]
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de Nota de Crédito
 **/
$tipo_de_nota = 13; // 13 = Nota de Crédito C

/**
 * Número de la ultima Nota de Crédito C
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_nota);

/**
 * Numero del punto de venta de la Factura 
 * asociada a la Nota de Crédito
 **/
$punto_factura_asociada = 1;

/**
 * Tipo de Factura asociada a la Nota de Crédito
 **/
$tipo_factura_asociada = 11; // 11 = Factura C

/**
 * Numero de Factura asociada a la Nota de Crédito
 **/
$numero_factura_asociada = 1;

/**
 * Concepto de la Nota de Crédito
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 80;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 33693450239;

/**
 * Numero de comprobante
 **/
$numero_de_nota = $last_voucher+1;

/**
 * Fecha de la Nota de Crédito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Importe de la Nota de Crédito
 **/
$importe_total = 100;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 6;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));

	/**
	 * Fecha de vencimiento del pago en formato aaaammdd
	 **/
	$fecha_vencimiento_pago = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
	$fecha_vencimiento_pago = null;
}


$data = array(
	'CantReg' 	=> 1, // Cantidad de Notas de Crédito a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_nota, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_nota,
	'CbteHasta' => $numero_de_nota,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => $fecha_vencimiento_pago,
	'ImpTotal' 	=> $importe_total,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_total, // Importe neto
	'ImpOpEx' 	=> 0, // Importe exento al IVA
	'ImpIVA' 	=> 0, // Importe de IVA
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en el comprobante ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)  
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'CbtesAsoc' => array( //Factura asociada
		array(
			'Tipo' 		=> $tipo_factura_asociada,
			'PtoVta' 	=> $punto_factura_asociada,
			'Nro' 		=> $numero_factura_asociada,
		)
	)
);

/** 
 * Creamos la Nota de Crédito 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Nota de Crédito 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Nota de Crédito
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 13 # 13 = Nota de Crédito C

# Número de la ultima Nota de Crédito C
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Crédito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Crédito
tipo_factura_asociada = 11 # 11 = Factura B

# Numero de Factura asociada a la Nota de Crédito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de Nota de Crédito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Crédito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Importe de la Nota de Crédito
importe_total = 100

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 6

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else 
  fecha_servicio_desde = nil
  fecha_servicio_hasta = nil
  fecha_vencimiento_pago = nil
end

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_total,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_total,
  "ImpOpEx": 0,
  "ImpIVA": 0,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
puts {
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 13 # 13 = Nota de Crédito C

# Número de la ultima Nota de Crédito C
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Crédito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Crédito
tipo_factura_asociada = 11 # 11 = Factura B

# Numero de Factura asociada a la Nota de Crédito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de Nota de Crédito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Crédito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Importe de la Nota de Crédito
importe_total = 100

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 6

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else:
  fecha_servicio_desde = None
  fecha_servicio_hasta = None
  fecha_vencimiento_pago = None

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_total,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_total,
  "ImpOpEx": 0,
  "ImpIVA": 0,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
print({
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de nota (13 = Nota de Crédito C)
int tipoDeLaNota = 13;

// Número de la ultima Nota de Crédito C
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada a la Nota de Crédito
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (11 = Factura C)
int tipoFacturaAsociada = 11;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239;

// Numero de Nota de Crédito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe de la Nota de Crédito
decimal importeTotal = 100;

// Condición frente al IVA del receptor
// 1=IVA Resp. Inscripto, 4=Exento, 5=CF, 6=Monotributo, ...
int condicionIvaReceptor = 6;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3)
{
    fechaServicioDesde  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaServicioHasta  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeLaNota },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeLaNota },
    { "CbteHasta",              numeroDeLaNota },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeTotal },
    { "ImpTotConc",             0 },
    { "ImpNeto",                importeTotal },
    { "ImpOpEx",                0 },
    { "ImpIVA",                 0 },
    { "ImpTrib",                0 },
    { "MonId",                  "PES" },
    { "MonCotiz",               1 },
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "CbtesAsoc", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Tipo",   tipoFacturaAsociada },
                { "PtoVta", puntoFacturaAsociada },
                { "Nro",    numeroFacturaAsociada }
            }
        }
    }
};

// Creamos la Nota de Crédito
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

Console.WriteLine($"CAE: {res["CAE"]}");
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de nota (13 = Nota de Crédito C)
int tipoDeLaNota = 13;

// Número de la ultima Nota de Crédito C
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada a la Nota de Crédito
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (11 = Factura C)
int tipoFacturaAsociada = 11;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239L;

// Numero de Nota de Crédito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe de la Nota de Crédito
double importeTotal = 100.0;

// Condición frente al IVA del receptor
// 1=IVA Resp. Inscripto, 4=Exento, 5=CF, 6=Monotributo, ...
int condicionIvaReceptor = 6;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3) {
    fechaServicioDesde  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaServicioHasta  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> facturaAsociada = new HashMap<>();
facturaAsociada.put("Tipo",   tipoFacturaAsociada);
facturaAsociada.put("PtoVta", puntoFacturaAsociada);
facturaAsociada.put("Nro",    numeroFacturaAsociada);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeLaNota);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeLaNota);
data.put("CbteHasta",             numeroDeLaNota);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeTotal);
data.put("ImpTotConc",            0);
data.put("ImpNeto",               importeTotal);
data.put("ImpOpEx",               0);
data.put("ImpIVA",                0);
data.put("ImpTrib",               0);
data.put("MonId",                 "PES");
data.put("MonCotiz",              1);
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("CbtesAsoc",             Arrays.asList(facturaAsociada));

// Creamos la Nota de Crédito
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

System.out.println("CAE:         " + res.get("CAE"));
System.out.println("Vencimiento: " + res.get("CAEFchVto"));
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq": {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 13
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 80,
                    "DocNro": 33693450239,
                    "CbteDesde": 9,
                    "CbteHasta": 9,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": null,
                    "ImpTotal": 100,
                    "ImpTotConc": 0,
                    "ImpNeto": 100,
                    "ImpOpEx": 0,
                    "ImpIVA": 0,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 6,
                    "CbtesAsoc": {
                        "CbteAsoc": [
                            {
                                "Tipo": 11,
                                "PtoVta": 1,
                                "Nro": 1
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Nota de Débito A

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_nota = 2; // 2 = Nota de Débito A
	
	/**
	 * Número de la ultima Nota de Débito A
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota);

	/**
	 * Numero del punto de venta de la Factura 
	 * asociada a la Nota de Débito
	 **/
	const punto_factura_asociada = 1;

	/**
	 * Tipo de Factura asociada a la Nota de Débito
	 **/
	const tipo_factura_asociada = 1; // 1 = Factura A

	/**
	 * Numero de Factura asociada a la Nota de Débito
	 **/
	const numero_factura_asociada = 1;

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 80;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 33693450239;

	/**
	 * Numero de Nota de Débito
	 **/
	const numero_de_nota = last_voucher+1;

	/**
	 * Fecha de la Nota de Débito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe sujeto al IVA (sin icluir IVA)
	 **/
	const importe_gravado = 100;

	/**
	 * Importe exento al IVA
	 **/
	const importe_exento_iva = 0;

	/**
	 * Importe de IVA
	 **/
	const importe_iva = 21;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 1;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	let fecha_servicio_desde = null, fecha_servicio_hasta = null, fecha_vencimiento_pago = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;

		/**
		 * Fecha de vencimiento del pago en formato aaaammdd
		 **/
		const fecha_vencimiento_pago = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de Notas de Crédito a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_nota, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_nota,
		'CbteHasta' : numero_de_nota,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : fecha_vencimiento_pago,
		'ImpTotal' 	: importe_gravado + importe_iva + importe_exento_iva,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_gravado,
		'ImpOpEx' 	: importe_exento_iva,
		'ImpIVA' 	: importe_iva,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos) 
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'CbtesAsoc' : [ //Factura asociada
			{
				'Tipo' 		: tipo_factura_asociada,
				'PtoVta' 	: punto_factura_asociada,
				'Nro' 		: numero_factura_asociada,
			}
		],
		'Iva' 		: [ // Alícuotas asociadas a la Nota de Débito
			{
				'Id' 		: 5, // Id del tipo de IVA (5 = 21%)
				'BaseImp' 	: importe_gravado,
				'Importe' 	: importe_iva 
			}
		]
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de Nota de Débito
 **/
$tipo_de_nota = 2; // 2 = Nota de Débito A

/**
 * Número de la ultima Nota de Débito A
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_nota);

/**
 * Numero del punto de venta de la Factura 
 * asociada a la Nota de Débito
 **/
$punto_factura_asociada = 1;

/**
 * Tipo de Factura asociada a la Nota de Débito
 **/
$tipo_factura_asociada = 1; // 1 = Factura A

/**
 * Numero de Factura asociada a la Nota de Débito
 **/
$numero_factura_asociada = 1;

/**
 * Concepto de la Nota de Débito
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 80;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 33693450239;

/**
 * Numero de Nota de Débito
 **/
$numero_de_nota = $last_voucher+1;

/**
 * Fecha de la Nota de Débito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Importe sujeto al IVA (sin icluir IVA)
 **/
$importe_gravado = 100;

/**
 * Importe exento al IVA
 **/
$importe_exento_iva = 0;

/**
 * Importe de IVA
 **/
$importe_iva = 21;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 1;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));

	/**
	 * Fecha de vencimiento del pago en formato aaaammdd
	 **/
	$fecha_vencimiento_pago = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
	$fecha_vencimiento_pago = null;
}

$data = array(
	'CantReg' 	=> 1, // Cantidad de Notas de Crédito a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_nota, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_nota,
	'CbteHasta' => $numero_de_nota,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => $fecha_vencimiento_pago,
	'ImpTotal' 	=> $importe_gravado + $importe_iva + $importe_exento_iva,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_gravado,
	'ImpOpEx' 	=> $importe_exento_iva,
	'ImpIVA' 	=> $importe_iva,
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en la Nota de Débito ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'CbtesAsoc' => array( //Factura asociada
		array(
			'Tipo' 		=> $tipo_factura_asociada,
			'PtoVta' 	=> $punto_factura_asociada,
			'Nro' 		=> $numero_factura_asociada,
		)
	),
	'Iva' 		=> array( // Alícuotas asociadas a la Nota de Débito
		array(
			'Id' 		=> 5, // Id del tipo de IVA (5 = 21%)
			'BaseImp' 	=> $importe_gravado,
			'Importe' 	=> $importe_iva 
		)
	), 
);

/** 
 * Creamos la Nota de Débito 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Nota de Débito 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Nota de Débito
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}
{% code fullWidth="false" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 2 # 2 = Nota de Débito A

# Número de la ultima Nota de Débito A
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Débito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Débito
tipo_factura_asociada = 1 # 1 = Factura A

# Numero de Factura asociada a la Nota de Débito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de Nota de Débito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Débito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 1

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else 
  fecha_servicio_desde = nil
  fecha_servicio_hasta = nil
  fecha_vencimiento_pago = nil
end

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ],
  "Iva": [ # Alícuotas asociadas a la Nota de Débito
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
puts {
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endcode %}
{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 2 # 2 = Nota de Débito A

# Número de la ultima Nota de Débito A
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Débito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Débito
tipo_factura_asociada = 1 # 1 = Factura A

# Numero de Factura asociada a la Nota de Débito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de Nota de Débito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Débito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 1

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else:
  fecha_servicio_desde = None
  fecha_servicio_hasta = None
  fecha_vencimiento_pago = None

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ],
  "Iva": [ # Alícuotas asociadas a la Nota de Débito
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
print({
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de nota (2 = Nota de Débito A)
int tipoDeLaNota = 2;

// Número de la ultima Nota de Débito A
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada a la Nota de Débito
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (1 = Factura A)
int tipoFacturaAsociada = 1;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239;

// Numero de Nota de Débito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe sujeto al IVA (sin incluir IVA)
decimal importeGravado = 100;

// Importe exento al IVA
decimal importeExentoIva = 0;

// Importe de IVA
decimal importeIva = 21;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 1;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3)
{
    fechaServicioDesde  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaServicioHasta  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeLaNota },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeLaNota },
    { "CbteHasta",              numeroDeLaNota },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeGravado + importeIva + importeExentoIva },
    { "ImpTotConc",             0 },
    { "ImpNeto",                importeGravado },
    { "ImpOpEx",                importeExentoIva },
    { "ImpIVA",                 importeIva },
    { "ImpTrib",                0 },
    { "MonId",                  "PES" },
    { "MonCotiz",               1 },
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "CbtesAsoc", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Tipo",   tipoFacturaAsociada },
                { "PtoVta", puntoFacturaAsociada },
                { "Nro",    numeroFacturaAsociada }
            }
        }
    },
    { "Iva", new List<Dictionary<string, object?>>      // Alícuotas asociadas a la Nota de Débito
        {
            new Dictionary<string, object?>
            {
                { "Id",      5 },
                { "BaseImp", importeGravado },
                { "Importe", importeIva }
            }
        }
    }
};

// Creamos la Nota de Débito
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

Console.WriteLine($"CAE: {res["CAE"]}");
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de nota (2 = Nota de Débito A)
int tipoDeLaNota = 2;

// Número de la ultima Nota de Débito A
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada a la Nota de Débito
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (1 = Factura A)
int tipoFacturaAsociada = 1;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239L;

// Numero de Nota de Débito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe sujeto al IVA (sin incluir IVA)
double importeGravado = 100.0;

// Importe exento al IVA
double importeExentoIva = 0;

// Importe de IVA
double importeIva = 21.0;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 1;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3) {
    fechaServicioDesde  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaServicioHasta  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> facturaAsociada = new HashMap<>();
facturaAsociada.put("Tipo",   tipoFacturaAsociada);
facturaAsociada.put("PtoVta", puntoFacturaAsociada);
facturaAsociada.put("Nro",    numeroFacturaAsociada);

Map<String, Object> alicuota = new HashMap<>();
alicuota.put("Id",      5); // Alícuotas asociadas a la Nota de Débito
alicuota.put("BaseImp", importeGravado);
alicuota.put("Importe", importeIva);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeLaNota);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeLaNota);
data.put("CbteHasta",             numeroDeLaNota);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeGravado + importeIva + importeExentoIva);
data.put("ImpTotConc",            0);
data.put("ImpNeto",               importeGravado);
data.put("ImpOpEx",               importeExentoIva);
data.put("ImpIVA",                importeIva);
data.put("ImpTrib",               0);
data.put("MonId",                 "PES");
data.put("MonCotiz",              1);
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("CbtesAsoc",             Arrays.asList(facturaAsociada));
data.put("Iva",                   Arrays.asList(alicuota));

// Creamos la Nota de Débito
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

System.out.println("CAE:         " + res.get("CAE"));
System.out.println("Vencimiento: " + res.get("CAEFchVto"));
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq": {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 2
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 80,
                    "DocNro": 33693450239,
                    "CbteDesde": 30,
                    "CbteHasta": 30,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": null,
                    "ImpTotal": 121,
                    "ImpTotConc": 0,
                    "ImpNeto": 100,
                    "ImpOpEx": 0,
                    "ImpIVA": 21,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 1,
                    "CbtesAsoc": {
                        "CbteAsoc": [
                            {
                                "Tipo": 1,
                                "PtoVta": 1,
                                "Nro": 1
                            }
                        ]
                    },
                    "Iva": {
                        "AlicIva": [
                            {
                                "Id": 5,
                                "BaseImp": 100,
                                "Importe": 21
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Nota de Débito B

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_nota = 7; // 7 = Nota de Débito B
	
	/**
	 * Número de la ultima Nota de Débito B
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota);

	/**
	 * Numero del punto de venta de la Factura 
	 * asociada a la Nota de Débito
	 **/
	const punto_factura_asociada = 1;

	/**
	 * Tipo de Factura asociada a la Nota de Débito
	 **/
	const tipo_factura_asociada = 6; // 6 = Factura B

	/**
	 * Numero de Factura asociada a la Nota de Débito
	 **/
	const numero_factura_asociada = 1;

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 99;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 0;

	/**
	 * Numero de Nota de Débito
	 **/
	const numero_de_nota = last_voucher+1;

	/**
	 * Fecha de la Nota de Débito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe sujeto al IVA (sin icluir IVA)
	 **/
	const importe_gravado = 100;

	/**
	 * Importe exento al IVA
	 **/
	const importe_exento_iva = 0;

	/**
	 * Importe de IVA
	 **/
	const importe_iva = 21;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 5;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	let fecha_servicio_desde = null, fecha_servicio_hasta = null, fecha_vencimiento_pago = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;

		/**
		 * Fecha de vencimiento del pago en formato aaaammdd
		 **/
		const fecha_vencimiento_pago = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de Notas de Crédito a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_nota, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_nota,
		'CbteHasta' : numero_de_nota,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : fecha_vencimiento_pago,
		'ImpTotal' 	: importe_gravado + importe_iva + importe_exento_iva,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_gravado,
		'ImpOpEx' 	: importe_exento_iva,
		'ImpIVA' 	: importe_iva,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos) 
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'CbtesAsoc' : [ //Factura asociada
			{
				'Tipo' 		: tipo_factura_asociada,
				'PtoVta' 	: punto_factura_asociada,
				'Nro' 		: numero_factura_asociada,
			}
		],
		'Iva' 		: [ // Alícuotas asociadas a la Nota de Débito
			{
				'Id' 		: 5, // Id del tipo de IVA (5 = 21%)
				'BaseImp' 	: importe_gravado,
				'Importe' 	: importe_iva 
			}
		]
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de Nota de Débito
 **/
$tipo_de_nota = 7; // 7 = Nota de Débito B

/**
 * Número de la ultima Nota de Débito B
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_nota);

/**
 * Numero del punto de venta de la Factura 
 * asociada a la Nota de Débito
 **/
$punto_factura_asociada = 1;

/**
 * Tipo de Factura asociada a la Nota de Débito
 **/
$tipo_factura_asociada = 6; // 6 = Factura B

/**
 * Numero de Factura asociada a la Nota de Débito
 **/
$numero_factura_asociada = 1;

/**
 * Concepto de la Nota de Débito
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 99;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 0;

/**
 * Numero de Nota de Débito
 **/
$numero_de_nota = $last_voucher+1;

/**
 * Fecha de la Nota de Débito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Importe sujeto al IVA (sin icluir IVA)
 **/
$importe_gravado = 100;

/**
 * Importe exento al IVA
 **/
$importe_exento_iva = 0;

/**
 * Importe de IVA
 **/
$importe_iva = 21;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 5;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));

	/**
	 * Fecha de vencimiento del pago en formato aaaammdd
	 **/
	$fecha_vencimiento_pago = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
	$fecha_vencimiento_pago = null;
}


$data = array(
	'CantReg' 	=> 1, // Cantidad de Notas de Crédito a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_nota, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_nota,
	'CbteHasta' => $numero_de_nota,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => $fecha_vencimiento_pago,
	'ImpTotal' 	=> $importe_gravado + $importe_iva + $importe_exento_iva,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_gravado,
	'ImpOpEx' 	=> $importe_exento_iva,
	'ImpIVA' 	=> $importe_iva,
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en la Nota de Débito ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)  
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'CbtesAsoc' => array( //Factura asociada
		array(
			'Tipo' 		=> $tipo_factura_asociada,
			'PtoVta' 	=> $punto_factura_asociada,
			'Nro' 		=> $numero_factura_asociada,
		)
	),
	'Iva' 		=> array(// Alícuotas asociadas a la Nota de Débito
		array(
			'Id' 		=> 5, // Id del tipo de IVA (5 = 21%)
			'BaseImp' 	=> $importe_gravado,
			'Importe' 	=> $importe_iva 
		)
	), 
);

/** 
 * Creamos la Nota de Débito 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Nota de Débito 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Nota de Débito
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 7 # 7 = Nota de Débito B

# Número de la ultima Nota de Débito B
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Débito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Débito
tipo_factura_asociada = 6 # 6 = Factura B

# Numero de Factura asociada a la Nota de Débito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 99

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 0

# Numero de Nota de Débito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Débito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 5

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else 
  fecha_servicio_desde = nil
  fecha_servicio_hasta = nil
  fecha_vencimiento_pago = nil
end

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ],
  "Iva": [ # Alícuotas asociadas a la Nota de Débito
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
puts {
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 7 # 7 = Nota de Débito B

# Número de la ultima Nota de Débito B
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Débito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Débito
tipo_factura_asociada = 6 # 6 = Factura B

# Numero de Factura asociada a la Nota de Débito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 99

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 0

# Numero de Nota de Débito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Débito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 5

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else:
  fecha_servicio_desde = None
  fecha_servicio_hasta = None
  fecha_vencimiento_pago = None

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ],
  "Iva": [ # Alícuotas asociadas a la Nota de Débito
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
print({
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de nota (7 = Nota de Débito B)
int tipoDeLaNota = 7;

// Número de la ultima Nota de Débito B
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada a la Nota de Débito
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (6 = Factura B)
int tipoFacturaAsociada = 6;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 99;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 0;

// Numero de Nota de Débito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe sujeto al IVA (sin incluir IVA)
decimal importeGravado = 100;

// Importe exento al IVA
decimal importeExentoIva = 0;

// Importe de IVA
decimal importeIva = 21;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 5;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3)
{
    fechaServicioDesde  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaServicioHasta  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeLaNota },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeLaNota },
    { "CbteHasta",              numeroDeLaNota },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeGravado + importeIva + importeExentoIva },
    { "ImpTotConc",             0 },
    { "ImpNeto",                importeGravado },
    { "ImpOpEx",                importeExentoIva },
    { "ImpIVA",                 importeIva },
    { "ImpTrib",                0 },
    { "MonId",                  "PES" },
    { "MonCotiz",               1 },
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "CbtesAsoc", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Tipo",   tipoFacturaAsociada },
                { "PtoVta", puntoFacturaAsociada },
                { "Nro",    numeroFacturaAsociada }
            }
        }
    },
    { "Iva", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Id",      5 },
                { "BaseImp", importeGravado },
                { "Importe", importeIva }
            }
        }
    }
};

// Creamos la Nota de Débito
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

Console.WriteLine($"CAE: {res["CAE"]}");
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de nota (7 = Nota de Débito B)
int tipoDeLaNota = 7;

// Número de la ultima Nota de Débito B
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada a la Nota de Débito
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (6 = Factura B)
int tipoFacturaAsociada = 6;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 99;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 0;

// Numero de Nota de Débito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe sujeto al IVA (sin incluir IVA)
double importeGravado = 100.0;

// Importe exento al IVA
double importeExentoIva = 0;

// Importe de IVA
double importeIva = 21.0;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 5;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3) {
    fechaServicioDesde  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaServicioHasta  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> facturaAsociada = new HashMap<>();
facturaAsociada.put("Tipo",   tipoFacturaAsociada);
facturaAsociada.put("PtoVta", puntoFacturaAsociada);
facturaAsociada.put("Nro",    numeroFacturaAsociada);

Map<String, Object> alicuota = new HashMap<>();
alicuota.put("Id",      5);
alicuota.put("BaseImp", importeGravado);
alicuota.put("Importe", importeIva);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeLaNota);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeLaNota);
data.put("CbteHasta",             numeroDeLaNota);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeGravado + importeIva + importeExentoIva);
data.put("ImpTotConc",            0);
data.put("ImpNeto",               importeGravado);
data.put("ImpOpEx",               importeExentoIva);
data.put("ImpIVA",                importeIva);
data.put("ImpTrib",               0);
data.put("MonId",                 "PES");
data.put("MonCotiz",              1);
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("CbtesAsoc",             Arrays.asList(facturaAsociada));
data.put("Iva",                   Arrays.asList(alicuota));

// Creamos la Nota de Débito
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

System.out.println("CAE:         " + res.get("CAE"));
System.out.println("Vencimiento: " + res.get("CAEFchVto"));
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq": {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 7
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 99,
                    "DocNro": 0,
                    "CbteDesde": 15,
                    "CbteHasta": 15,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": null,
                    "ImpTotal": 121,
                    "ImpTotConc": 0,
                    "ImpNeto": 100,
                    "ImpOpEx": 0,
                    "ImpIVA": 21,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 5,
                    "CbtesAsoc": {
                        "CbteAsoc": [
                            {
                                "Tipo": 6,
                                "PtoVta": 1,
                                "Nro": 1
                            }
                        ]
                    },
                    "Iva": {
                        "AlicIva": [
                            {
                                "Id": 5,
                                "BaseImp": 100,
                                "Importe": 21
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Nota de Débito C

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_nota = 12; // 12 = Nota de Débito C
	
	/**
	 * Número de la ultima Nota de Débito C
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota);

	/**
	 * Numero del punto de venta de la Factura 
	 * asociada a la Nota de Débito
	 **/
	const punto_factura_asociada = 1;

	/**
	 * Tipo de Factura asociada a la Nota de Débito
	 **/
	const tipo_factura_asociada = 11; // 11 = Factura C

	/**
	 * Numero de Factura asociada a la Nota de Débito
	 **/
	const numero_factura_asociada = 1;

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 80;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 33693450239;

	/**
	 * Numero de Nota de Débito
	 **/
	const numero_de_nota = last_voucher+1;

	/**
	 * Fecha de la Nota de Débito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe de la Nota de Débito
	 **/
	const importe_total = 100;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 6;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	let fecha_servicio_desde = null, fecha_servicio_hasta = null, fecha_vencimiento_pago = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;

		/**
		 * Fecha de vencimiento del pago en formato aaaammdd
		 **/
		const fecha_vencimiento_pago = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de Notas de Crédito a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_nota, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_nota,
		'CbteHasta' : numero_de_nota,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : fecha_vencimiento_pago,
		'ImpTotal' 	: importe_total,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_total,
		'ImpOpEx' 	: 0,
		'ImpIVA' 	: 0,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos) 
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'CbtesAsoc' : [ //Factura asociada
			{
				'Tipo' 		: tipo_factura_asociada,
				'PtoVta' 	: punto_factura_asociada,
				'Nro' 		: numero_factura_asociada,
			}
		]
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de Nota de Débito
 **/
$tipo_de_nota = 12; // 12 = Nota de Débito C

/**
 * Número de la ultima Nota de Débito C
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_nota);

/**
 * Numero del punto de venta de la Factura 
 * asociada a la Nota de Débito
 **/
$punto_factura_asociada = 1;

/**
 * Tipo de Factura asociada a la Nota de Débito
 **/
$tipo_factura_asociada = 11; // 11 = Factura C

/**
 * Numero de Factura asociada a la Nota de Débito
 **/
$numero_factura_asociada = 1;

/**
 * Concepto de la Nota de Débito
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 80;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 33693450239;

/**
 * Numero de comprobante
 **/
$numero_de_nota = $last_voucher+1;

/**
 * Fecha de la Nota de Débito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Importe de la Nota de Débito
 **/
$importe_total = 100;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 6;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));

	/**
	 * Fecha de vencimiento del pago en formato aaaammdd
	 **/
	$fecha_vencimiento_pago = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
	$fecha_vencimiento_pago = null;
}


$data = array(
	'CantReg' 	=> 1, // Cantidad de Notas de Crédito a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_nota, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_nota,
	'CbteHasta' => $numero_de_nota,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => $fecha_vencimiento_pago,
	'ImpTotal' 	=> $importe_total,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_total, // Importe neto
	'ImpOpEx' 	=> 0, // Importe exento al IVA
	'ImpIVA' 	=> 0, // Importe de IVA
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en el comprobante ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)  
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'CbtesAsoc' => array( //Factura asociada
		array(
			'Tipo' 		=> $tipo_factura_asociada,
			'PtoVta' 	=> $punto_factura_asociada,
			'Nro' 		=> $numero_factura_asociada,
		)
	)
);

/** 
 * Creamos la Nota de Débito 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Nota de Débito 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Nota de Débito
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 12 # 12 = Nota de Débito C

# Número de la ultima Nota de Débito C
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Débito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Débito
tipo_factura_asociada = 11 # 11 = Factura B

# Numero de Factura asociada a la Nota de Débito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de Nota de Débito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Débito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Importe de la Nota de Débito
importe_total = 100

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 6

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else 
  fecha_servicio_desde = nil
  fecha_servicio_hasta = nil
  fecha_vencimiento_pago = nil
end

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_total,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_total,
  "ImpOpEx": 0,
  "ImpIVA": 0,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
puts {
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 12 # 12 = Nota de Débito C

# Número de la ultima Nota de Débito C
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Débito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Débito
tipo_factura_asociada = 11 # 11 = Factura B

# Numero de Factura asociada a la Nota de Débito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de Nota de Débito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Débito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Importe de la Nota de Débito
importe_total = 100

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 6

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else:
  fecha_servicio_desde = None
  fecha_servicio_hasta = None
  fecha_vencimiento_pago = None

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_total,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_total,
  "ImpOpEx": 0,
  "ImpIVA": 0,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
print({
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de nota (12 = Nota de Débito C)
int tipoDeLaNota = 12;

// Número de la ultima Nota de Débito C
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada a la Nota de Débito
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (11 = Factura C)
int tipoFacturaAsociada = 11;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239;

// Numero de Nota de Débito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe de la Nota de Débito
decimal importeTotal = 100;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 6;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3)
{
    fechaServicioDesde  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaServicioHasta  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeLaNota },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeLaNota },
    { "CbteHasta",              numeroDeLaNota },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeTotal },
    { "ImpTotConc",             0 },
    { "ImpNeto",                importeTotal },
    { "ImpOpEx",                0 },
    { "ImpIVA",                 0 },
    { "ImpTrib",                0 },
    { "MonId",                  "PES" },
    { "MonCotiz",               1 },
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "CbtesAsoc", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Tipo",   tipoFacturaAsociada },
                { "PtoVta", puntoFacturaAsociada },
                { "Nro",    numeroFacturaAsociada }
            }
        }
    }
};

// Creamos la Nota de Débito
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

Console.WriteLine($"CAE: {res["CAE"]}");
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de nota (12 = Nota de Débito C)
int tipoDeLaNota = 12;

// Número de la ultima Nota de Débito C
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada a la Nota de Débito
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (11 = Factura C)
int tipoFacturaAsociada = 11;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239L;

// Numero de Nota de Débito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe de la Nota de Débito
double importeTotal = 100.0;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 6;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3) {
    fechaServicioDesde  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaServicioHasta  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> facturaAsociada = new HashMap<>();
facturaAsociada.put("Tipo",   tipoFacturaAsociada);
facturaAsociada.put("PtoVta", puntoFacturaAsociada);
facturaAsociada.put("Nro",    numeroFacturaAsociada);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeLaNota);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeLaNota);
data.put("CbteHasta",             numeroDeLaNota);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeTotal);
data.put("ImpTotConc",            0);
data.put("ImpNeto",               importeTotal);
data.put("ImpOpEx",               0);
data.put("ImpIVA",                0);
data.put("ImpTrib",               0);
data.put("MonId",                 "PES");
data.put("MonCotiz",              1);
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("CbtesAsoc",             Arrays.asList(facturaAsociada));

// Creamos la Nota de Débito
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

System.out.println("CAE:         " + res.get("CAE"));
System.out.println("Vencimiento: " + res.get("CAEFchVto"));
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq": {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 12
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 80,
                    "DocNro": 33693450239,
                    "CbteDesde": 9,
                    "CbteHasta": 9,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": null,
                    "ImpTotal": 100,
                    "ImpTotConc": 0,
                    "ImpNeto": 100,
                    "ImpOpEx": 0,
                    "ImpIVA": 0,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 6,
                    "CbtesAsoc": {
                        "CbteAsoc": [
                            {
                                "Tipo": 11,
                                "PtoVta": 1,
                                "Nro": 1
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Factura de Crédito electrónica A

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_factura = 201; // 201 = Factura de Crédito electrónica MiPyMEs (FCE) A
	
	/**
	 * Número de la ultima Factura de Crédito electrónica MiPyMEs (FCE) A
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura);

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 80;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 30679928879;

	/**
	 * Numero de factura
	 **/
	const numero_de_factura = last_voucher+1;

	/**
	 * Numero de CBU del cliente
	 * Es requerido para realizar una factura de crédito electrónica
	 **/
	const CBU = '1234567890123456789012';

	/**
	 * Tipo de Transferencia
	 * Es requerido para realizar una factura de crédito electrónica
	 * SCA = 'TRANSFERENCIA AL SISTEMA DE CIRCULACION ABIERTA'
	 * ADC = 'AGENTE DE DEPOSITO COLECTIVO'
	 **/
	const transferencia = 'ADC';

	/**
	 * Fecha de la factura en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Fecha de vencimiento del pago en formato aaaa-mm-dd
	 **/
	const fecha_vencimiento_pago = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe sujeto al IVA (sin icluir IVA)
	 **/
	const importe_gravado = 100000;

	/**
	 * Importe exento al IVA
	 **/
	const importe_exento_iva = 0;

	/**
	 * Importe de IVA
	 **/
	const importe_iva = 21000;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 1;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	let fecha_servicio_desde = null, fecha_servicio_hasta = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de facturas a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_factura, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_factura,
		'CbteHasta' : numero_de_factura,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : parseInt(fecha_vencimiento_pago.replace(/-/g, '')),
		'ImpTotal' 	: importe_gravado + importe_iva + importe_exento_iva,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_gravado,
		'ImpOpEx' 	: importe_exento_iva,
		'ImpIVA' 	: importe_iva,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada en la factura ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos)  
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'Iva' 		: [ // Alícuotas asociadas a la factura
			{
				'Id' 		: 5, // Id del tipo de IVA (5 = 21%)
				'BaseImp' 	: importe_gravado,
				'Importe' 	: importe_iva 
			}
		],
		'Opcionales' : [ // (Opcional) Alícuotas asociadas al comprobante
			{
				'Id'	: 2101, // ID del campo opcion opcional (2101 = CBU)
				'Valor'	: CBU
			},
			{
				'Id': 27, // ID del campo opcion opcional (27 = Transferencia)
				'Valor': transferencia
			}
		],
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de factura
 **/
$tipo_de_factura = 201; // 201 = Factura de Crédito electrónica MiPyMEs (FCE) A

/**
 * Número de la ultima Factura de Crédito electrónica MiPyMEs (FCE) A
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_factura);

/**
 * Concepto de la factura
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 80;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 30679928879;

/**
 * Numero de factura
 **/
$numero_de_factura = $last_voucher+1;

/**
 * Numero de CBU del cliente
 * Es requerido para realizar una factura de crédito electrónica
 **/
$CBU = '1234567890123456789012';

/**
 * Tipo de Transferencia
 * Es requerido para realizar una factura de crédito electrónica
 * SCA = 'TRANSFERENCIA AL SISTEMA DE CIRCULACION ABIERTA'
 * ADC = 'AGENTE DE DEPOSITO COLECTIVO'
 **/
$transferencia = 'ADC';

/**
 * Fecha de la factura en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Fecha de vencimiento del pago en formato aaaa-mm-dd
 **/
$fecha_vencimiento_pago = date('Y-m-d');

/**
 * Importe sujeto al IVA (sin icluir IVA)
 **/
$importe_gravado = 100000;

/**
 * Importe exento al IVA
 **/
$importe_exento_iva = 0;

/**
 * Importe de IVA
 **/
$importe_iva = 21000;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 1;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
}

$data = array(
	'CantReg' 	=> 1, // Cantidad de facturas a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_factura, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_factura,
	'CbteHasta' => $numero_de_factura,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => intval(str_replace('-', '', $fecha_vencimiento_pago)),
	'ImpTotal' 	=> $importe_gravado + $importe_iva + $importe_exento_iva,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_gravado,
	'ImpOpEx' 	=> $importe_exento_iva,
	'ImpIVA' 	=> $importe_iva,
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en la factura ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)  
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'Iva' 		=> array(// Alícuotas asociadas al factura
		array(
			'Id' 		=> 5, // Id del tipo de IVA (5 = 21%)
			'BaseImp' 	=> $importe_gravado,
			'Importe' 	=> $importe_iva 
		)
	),
	'Opcionales' => array( // (Opcional) Alícuotas asociadas al comprobante
		array(
			'Id'	=> 2101, // ID del campo opcion opcional (2101 = CBU)
			'Valor'	=> $CBU
		),
		array(
			'Id'	=> 27, // ID del campo opcion opcional (27 = Transferencia)
			'Valor'	=> $transferencia
		)
	),
);

/** 
 * Creamos la Factura 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Factura 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Factura
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_factura = 201 # 201 = Factura de Crédito electrónica MiPyMEs (FCE) A

# Número de la ultima Factura de Crédito electrónica MiPyMEs (FCE) A
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura)

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 30679928879

# Numero de factura
numero_de_factura = last_voucher+1

# Numero de CBU del cliente
# Es requerido para realizar una factura de crédito electrónica
CBU = '1234567890123456789012'

# Tipo de Transferencia
# Es requerido para realizar una factura de crédito electrónica
# SCA = 'TRANSFERENCIA AL SISTEMA DE CIRCULACION ABIERTA'
# ADC = 'AGENTE DE DEPOSITO COLECTIVO'
transferencia = 'ADC'

# Fecha de la factura en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Fecha de vencimiento del pago en formato aaaa-mm-dd
fecha_vencimiento_pago = Time.now.strftime("%Y%m%d").to_i

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100000

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21000

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 1

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213
else
  fecha_servicio_desde = nil
  fecha_servicio_hasta = nil
end

data = {
  "CantReg": 1, # Cantidad de facturas a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_factura, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_factura,
  "CbteHasta": numero_de_factura,
  "CbteFch": fecha,	
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, #Importe total de tributos
  "MonId": "PES", #Tipo de moneda usada en la factura ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos)  
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "Iva": [ # Alícuotas asociadas a la factura
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ],
  "Opcionales": [ # (Opcional) Alícuotas asociadas al comprobante
    {
      "Id": 2101, # ID del campo opcion opcional (2101 = CBU)
      "Valor": CBU
    },
    {
      "Id": 27, # ID del campo opcion opcional (27 = Transferencia)
      "Valor": transferencia
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

puts {
  "cae" : res["CAE"], # CAE asignado a la Factura
  "vencimiento" : res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_factura = 201 # 201 = Factura de Crédito electrónica MiPyMEs (FCE) A

# Número de la ultima Factura de Crédito electrónica MiPyMEs (FCE) A
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura)

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 30679928879

# Numero de factura
numero_de_factura = last_voucher+1

# Numero de CBU del cliente
# Es requerido para realizar una factura de crédito electrónica
CBU = '1234567890123456789012'

# Tipo de Transferencia
# Es requerido para realizar una factura de crédito electrónica
# SCA = 'TRANSFERENCIA AL SISTEMA DE CIRCULACION ABIERTA'
# ADC = 'AGENTE DE DEPOSITO COLECTIVO'
transferencia = 'ADC'

# Fecha de la factura en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Fecha de vencimiento del pago en formato aaaa-mm-dd
fecha_vencimiento_pago = int(datetime.today().strftime("%Y%m%d"))

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100000

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21000

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 1

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213
else:
  fecha_servicio_desde = None
  fecha_servicio_hasta = None

data = {
  "CantReg": 1, # Cantidad de facturas a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_factura, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_factura,
  "CbteHasta": numero_de_factura,
  "CbteFch": fecha,	
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, #Importe total de tributos
  "MonId": "PES", #Tipo de moneda usada en la factura ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos)  
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "Iva": [ # Alícuotas asociadas a la factura
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ],
  "Opcionales": [ # (Opcional) Alícuotas asociadas al comprobante
    {
      "Id": 2101, # ID del campo opcion opcional (2101 = CBU)
      "Valor": CBU
    },
    {
      "Id": 27, # ID del campo opcion opcional (27 = Transferencia)
      "Valor": transferencia
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

print({
  "cae" : res["CAE"], # CAE asignado a la Factura
  "vencimiento" : res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de factura (201 = Factura de Crédito electrónica MiPyMEs A)
int tipoDeFactura = 201;

// Número de la ultima Factura de Crédito electrónica MiPyMEs A
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeFactura);

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador
long numeroDeDocumento = 30679928879;

// Numero de factura
int numeroDeFactura = lastVoucher + 1;

// Numero de CBU del cliente (requerido para FCE)
string CBU = "1234567890123456789012";

// Tipo de Transferencia (requerido para FCE)
// SCA = 'TRANSFERENCIA AL SISTEMA DE CIRCULACION ABIERTA'
// ADC = 'AGENTE DE DEPOSITO COLECTIVO'
string transferencia = "ADC";

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Fecha de vencimiento del pago en formato aaaammdd
int fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe sujeto al IVA (sin incluir IVA)
decimal importeGravado = 100000;

// Importe exento al IVA
decimal importeExentoIva = 0;

// Importe de IVA
decimal importeIva = 21000;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 1;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null;

if (concepto == 2 || concepto == 3)
{
    fechaServicioDesde = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaServicioHasta = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeFactura },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeFactura },
    { "CbteHasta",              numeroDeFactura },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeGravado + importeIva + importeExentoIva },
    { "ImpTotConc",             0 },
    { "ImpNeto",                importeGravado },
    { "ImpOpEx",                importeExentoIva },
    { "ImpIVA",                 importeIva },
    { "ImpTrib",                0 },
    { "MonId",                  "PES" },
    { "MonCotiz",               1 },
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "Iva", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Id",      5 },
                { "BaseImp", importeGravado },
                { "Importe", importeIva }
            }
        }
    },
    { "Opcionales", new List<Dictionary<string, object?>> // Campos opcionales del comprobante
        {
            new Dictionary<string, object?> { { "Id", 2101 }, { "Valor", CBU } },          // CBU
            new Dictionary<string, object?> { { "Id", 27 },   { "Valor", transferencia } } // Transferencia
        }
    }
};

// Creamos la Factura
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

Console.WriteLine($"CAE: {res["CAE"]}");
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de factura (201 = Factura de Crédito electrónica MiPyMEs A)
int tipoDeFactura = 201;

// Número de la ultima Factura de Crédito electrónica MiPyMEs A
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeFactura);

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador
long numeroDeDocumento = 30679928879L;

// Numero de factura
int numeroDeFactura = lastVoucher + 1;

// Numero de CBU del cliente (requerido para FCE)
String CBU = "1234567890123456789012";

// Tipo de Transferencia (requerido para FCE)
// SCA = 'TRANSFERENCIA AL SISTEMA DE CIRCULACION ABIERTA'
// ADC = 'AGENTE DE DEPOSITO COLECTIVO'
String transferencia = "ADC";

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Fecha de vencimiento del pago en formato aaaammdd
int fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe sujeto al IVA (sin incluir IVA)
double importeGravado = 100000.0;

// Importe exento al IVA
double importeExentoIva = 0;

// Importe de IVA
double importeIva = 21000.0;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 1;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null;

if (concepto == 2 || concepto == 3) {
    fechaServicioDesde = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaServicioHasta = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> alicuota = new HashMap<>();
alicuota.put("Id",      5);
alicuota.put("BaseImp", importeGravado);
alicuota.put("Importe", importeIva);

Map<String, Object> opCBU = new HashMap<>();
opCBU.put("Id",    2101); // ID del campo opcion opcional (2101 = CBU)
opCBU.put("Valor", CBU);

Map<String, Object> opTransferencia = new HashMap<>();
opTransferencia.put("Id",    27); // ID del campo opcion opcional (27 = Transferencia)
opTransferencia.put("Valor", transferencia);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeFactura);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeFactura);
data.put("CbteHasta",             numeroDeFactura);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeGravado + importeIva + importeExentoIva);
data.put("ImpTotConc",            0);
data.put("ImpNeto",               importeGravado);
data.put("ImpOpEx",               importeExentoIva);
data.put("ImpIVA",                importeIva);
data.put("ImpTrib",               0);
data.put("MonId",                 "PES");
data.put("MonCotiz",              1);
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("Iva",                   Arrays.asList(alicuota));
data.put("Opcionales",            Arrays.asList(opCBU, opTransferencia)); // Campos opcionales del comprobante

// Creamos la Factura
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

System.out.println("CAE:         " + res.get("CAE"));
System.out.println("Vencimiento: " + res.get("CAEFchVto"));
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq": {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 201
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 80,
                    "DocNro": 30679928879,
                    "CbteDesde": 4,
                    "CbteHasta": 4,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": 20240314,
                    "ImpTotal": 121000,
                    "ImpTotConc": 0,
                    "ImpNeto": 100000,
                    "ImpOpEx": 0,
                    "ImpIVA": 21000,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 1,
                    "Iva": {
                        "AlicIva": [
                            {
                                "Id": 5,
                                "BaseImp": 100000,
                                "Importe": 21000
                            }
                        ]
                    },
                    "Opcionales": {
                        "Opcional": [
                            {
                                "Id": 2101,
                                "Valor": "1234567890123456789012"
                            },
                            {
                                "Id": 27,
                                "Valor": "ADC"
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Factura de Crédito electrónica B

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_factura = 206; // 206 = Factura de Crédito electrónica MiPyMEs (FCE) B
	
	/**
	 * Número de la ultima Factura de Crédito electrónica MiPyMEs (FCE) B
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura);

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 80;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 30679928879;

	/**
	 * Numero de factura
	 **/
	const numero_de_factura = last_voucher+1;

	/**
	 * Numero de CBU del cliente
	 * Es requerido para realizar una factura de crédito electrónica
	 **/
	const CBU = '1234567890123456789012';
	
	/**
	 * Tipo de Transferencia
	 * Es requerido para realizar una factura de crédito electrónica
	 * SCA = 'TRANSFERENCIA AL SISTEMA DE CIRCULACION ABIERTA'
	 * ADC = 'AGENTE DE DEPOSITO COLECTIVO'
	 **/
	const transferencia = 'ADC';

	/**
	 * Fecha de la factura en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Fecha de vencimiento del pago en formato aaaa-mm-dd
	 **/
	const fecha_vencimiento_pago = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe sujeto al IVA (sin icluir IVA)
	 **/
	const importe_gravado = 100000;

	/**
	 * Importe exento al IVA
	 **/
	const importe_exento_iva = 0;

	/**
	 * Importe de IVA
	 **/
	const importe_iva = 21000;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 5;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	let fecha_servicio_desde = null, fecha_servicio_hasta = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de facturas a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_factura, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_factura,
		'CbteHasta' : numero_de_factura,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : parseInt(fecha_vencimiento_pago.replace(/-/g, '')),
		'ImpTotal' 	: importe_gravado + importe_iva + importe_exento_iva,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_gravado,
		'ImpOpEx' 	: importe_exento_iva,
		'ImpIVA' 	: importe_iva,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada en la factura ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos)  
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'Iva' 		: [ // Alícuotas asociadas a la factura
			{
				'Id' 		: 5, // Id del tipo de IVA (5 = 21%)
				'BaseImp' 	: importe_gravado,
				'Importe' 	: importe_iva 
			}
		],
		'Opcionales' : [ // (Opcional) Alícuotas asociadas al comprobante
			{
				'Id'	: 2101, // ID del campo opcion opcional (2101 = CBU)
				'Valor'	: CBU
			},
			{
				'Id': 27, // ID del campo opcion opcional (27 = Transferencia)
				'Valor': transferencia
			}
		],
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de factura
 **/
$tipo_de_factura = 206; // 206 = Factura de Crédito electrónica MiPyMEs (FCE) B

/**
 * Número de la ultima Factura de Crédito electrónica MiPyMEs (FCE) B
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_factura);

/**
 * Concepto de la factura
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 80;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 30679928879;

/**
 * Numero de factura
 **/
$numero_de_factura = $last_voucher+1;

/**
 * Numero de CBU del cliente
 * Es requerido para realizar una factura de crédito electrónica
 **/
$CBU = '1234567890123456789012';

/**
 * Tipo de Transferencia
 * Es requerido para realizar una factura de crédito electrónica
 * SCA = 'TRANSFERENCIA AL SISTEMA DE CIRCULACION ABIERTA'
 * ADC = 'AGENTE DE DEPOSITO COLECTIVO'
 **/
$transferencia = 'ADC';

/**
 * Fecha de la factura en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Fecha de vencimiento del pago en formato aaaa-mm-dd
 **/
$fecha_vencimiento_pago = date('Y-m-d');

/**
 * Importe sujeto al IVA (sin icluir IVA)
 **/
$importe_gravado = 100000;

/**
 * Importe exento al IVA
 **/
$importe_exento_iva = 0;

/**
 * Importe de IVA
 **/
$importe_iva = 21000;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 5;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
}

$data = array(
	'CantReg' 	=> 1, // Cantidad de facturas a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_factura, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_factura,
	'CbteHasta' => $numero_de_factura,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => intval(str_replace('-', '', $fecha_vencimiento_pago)),
	'ImpTotal' 	=> $importe_gravado + $importe_iva + $importe_exento_iva,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_gravado,
	'ImpOpEx' 	=> $importe_exento_iva,
	'ImpIVA' 	=> $importe_iva,
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en la factura ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)  
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'Iva' 		=> array(// Alícuotas asociadas al factura
		array(
			'Id' 		=> 5, // Id del tipo de IVA (5 = 21%)
			'BaseImp' 	=> $importe_gravado,
			'Importe' 	=> $importe_iva 
		)
	),
	'Opcionales' => array( // (Opcional) Alícuotas asociadas al comprobante
		array(
			'Id'	=> 2101, // ID del campo opcion opcional (2101 = CBU)
			'Valor'	=> $CBU
		),
		array(
			'Id'	=> 27, // ID del campo opcion opcional (27 = Transferencia)
			'Valor'	=> $transferencia
		)
	),
);

/** 
 * Creamos la Factura 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Factura 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Factura
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_factura = 206 # 206 = Factura de Crédito electrónica MiPyMEs (FCE) B

# Número de la ultima Factura de Crédito electrónica MiPyMEs (FCE) B
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura)

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 30679928879

# Numero de factura
numero_de_factura = last_voucher+1

# Numero de CBU del cliente
# Es requerido para realizar una factura de crédito electrónica
CBU = '1234567890123456789012'

# Tipo de Transferencia
# Es requerido para realizar una factura de crédito electrónica
# SCA = 'TRANSFERENCIA AL SISTEMA DE CIRCULACION ABIERTA'
# ADC = 'AGENTE DE DEPOSITO COLECTIVO'
transferencia = 'ADC'

# Fecha de la factura en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Fecha de vencimiento del pago en formato aaaa-mm-dd
fecha_vencimiento_pago = Time.now.strftime("%Y%m%d").to_i

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100000

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21000

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 5

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213
else
  fecha_servicio_desde = nil
  fecha_servicio_hasta = nil
end

data = {
  "CantReg": 1, # Cantidad de facturas a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_factura, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_factura,
  "CbteHasta": numero_de_factura,
  "CbteFch": fecha,	
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, #Importe total de tributos
  "MonId": "PES", #Tipo de moneda usada en la factura ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos)  
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "Iva": [ # Alícuotas asociadas a la factura
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ],
  "Opcionales": [ # (Opcional) Alícuotas asociadas al comprobante
    {
      "Id": 2101, # ID del campo opcion opcional (2101 = CBU)
      "Valor": CBU
    },
    {
      "Id": 27, # ID del campo opcion opcional (27 = Transferencia)
      "Valor": transferencia
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

puts {
  "cae" : res["CAE"], # CAE asignado a la Factura
  "vencimiento" : res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_factura = 206 # 206 = Factura de Crédito electrónica MiPyMEs (FCE) B

# Número de la ultima Factura de Crédito electrónica MiPyMEs (FCE) B
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura)

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 30679928879

# Numero de factura
numero_de_factura = last_voucher+1

# Numero de CBU del cliente
# Es requerido para realizar una factura de crédito electrónica
CBU = '1234567890123456789012'

# Tipo de Transferencia
# Es requerido para realizar una factura de crédito electrónica
# SCA = 'TRANSFERENCIA AL SISTEMA DE CIRCULACION ABIERTA'
# ADC = 'AGENTE DE DEPOSITO COLECTIVO'
transferencia = 'ADC'

# Fecha de la factura en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Fecha de vencimiento del pago en formato aaaa-mm-dd
fecha_vencimiento_pago = int(datetime.today().strftime("%Y%m%d"))

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100000

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21000

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 5

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213
else:
  fecha_servicio_desde = None
  fecha_servicio_hasta = None

data = {
  "CantReg": 1, # Cantidad de facturas a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_factura, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_factura,
  "CbteHasta": numero_de_factura,
  "CbteFch": fecha,	
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, #Importe total de tributos
  "MonId": "PES", #Tipo de moneda usada en la factura ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos)  
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "Iva": [ # Alícuotas asociadas a la factura
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ],
  "Opcionales": [ # (Opcional) Alícuotas asociadas al comprobante
    {
      "Id": 2101, # ID del campo opcion opcional (2101 = CBU)
      "Valor": CBU
    },
    {
      "Id": 27, # ID del campo opcion opcional (27 = Transferencia)
      "Valor": transferencia
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

print({
  "cae" : res["CAE"], # CAE asignado a la Factura
  "vencimiento" : res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de factura (206 = Factura de Crédito electrónica MiPyMEs B)
int tipoDeFactura = 206;

// Número de la ultima Factura de Crédito electrónica MiPyMEs B
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeFactura);

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador
long numeroDeDocumento = 30679928879;

// Numero de factura
int numeroDeFactura = lastVoucher + 1;

// Numero de CBU del cliente (requerido para FCE)
string CBU = "1234567890123456789012";

// Tipo de Transferencia (requerido para FCE)
string transferencia = "ADC";

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Fecha de vencimiento del pago en formato aaaammdd
int fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe sujeto al IVA (sin incluir IVA)
decimal importeGravado = 100000;

// Importe exento al IVA
decimal importeExentoIva = 0;

// Importe de IVA
decimal importeIva = 21000;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 5;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null;

if (concepto == 2 || concepto == 3)
{
    fechaServicioDesde = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaServicioHasta = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeFactura },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeFactura },
    { "CbteHasta",              numeroDeFactura },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeGravado + importeIva + importeExentoIva },
    { "ImpTotConc",             0 },
    { "ImpNeto",                importeGravado },
    { "ImpOpEx",                importeExentoIva },
    { "ImpIVA",                 importeIva },
    { "ImpTrib",                0 },
    { "MonId",                  "PES" },
    { "MonCotiz",               1 },
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "Iva", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Id",      5 },
                { "BaseImp", importeGravado },
                { "Importe", importeIva }
            }
        }
    },
    { "Opcionales", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?> { { "Id", 2101 }, { "Valor", CBU } },
            new Dictionary<string, object?> { { "Id", 27 },   { "Valor", transferencia } }
        }
    }
};

// Creamos la Factura
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

Console.WriteLine($"CAE: {res["CAE"]}");
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de factura (206 = Factura de Crédito electrónica MiPyMEs B)
int tipoDeFactura = 206;

// Número de la ultima Factura de Crédito electrónica MiPyMEs B
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeFactura);

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador
long numeroDeDocumento = 30679928879L;

// Numero de factura
int numeroDeFactura = lastVoucher + 1;

// Numero de CBU del cliente (requerido para FCE)
String CBU = "1234567890123456789012";

// Tipo de Transferencia (requerido para FCE)
String transferencia = "ADC";

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Fecha de vencimiento del pago en formato aaaammdd
int fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe sujeto al IVA (sin incluir IVA)
double importeGravado = 100000.0;

// Importe exento al IVA
double importeExentoIva = 0;

// Importe de IVA
double importeIva = 21000.0;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 5;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null;

if (concepto == 2 || concepto == 3) {
    fechaServicioDesde = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaServicioHasta = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> alicuota = new HashMap<>();
alicuota.put("Id",      5);
alicuota.put("BaseImp", importeGravado);
alicuota.put("Importe", importeIva);

Map<String, Object> opCBU = new HashMap<>();
opCBU.put("Id",    2101);
opCBU.put("Valor", CBU);

Map<String, Object> opTransferencia = new HashMap<>();
opTransferencia.put("Id",    27);
opTransferencia.put("Valor", transferencia);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeFactura);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeFactura);
data.put("CbteHasta",             numeroDeFactura);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeGravado + importeIva + importeExentoIva);
data.put("ImpTotConc",            0);
data.put("ImpNeto",               importeGravado);
data.put("ImpOpEx",               importeExentoIva);
data.put("ImpIVA",                importeIva);
data.put("ImpTrib",               0);
data.put("MonId",                 "PES");
data.put("MonCotiz",              1);
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("Iva",                   Arrays.asList(alicuota));
data.put("Opcionales",            Arrays.asList(opCBU, opTransferencia));

// Creamos la Factura
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

System.out.println("CAE:         " + res.get("CAE"));
System.out.println("Vencimiento: " + res.get("CAEFchVto"));
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq": {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 206
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 80,
                    "DocNro": 30679928879,
                    "CbteDesde": 3,
                    "CbteHasta": 3,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": 20240314,
                    "ImpTotal": 121000,
                    "ImpTotConc": 0,
                    "ImpNeto": 100000,
                    "ImpOpEx": 0,
                    "ImpIVA": 21000,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 5,
                    "Iva": {
                        "AlicIva": [
                            {
                                "Id": 5,
                                "BaseImp": 100000,
                                "Importe": 21000
                            }
                        ]
                    },
                    "Opcionales": {
                        "Opcional": [
                            {
                                "Id": 2101,
                                "Valor": "1234567890123456789012"
                            },
                            {
                                "Id": 27,
                                "Valor": "ADC"
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Factura de Crédito electrónica C

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_factura = 211; // 211 = Factura de Crédito electrónica MiPyMEs (FCE) C
	
	/**
	 * Número de la ultima Factura de Crédito electrónica MiPyMEs (FCE) C
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura);

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 80;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 30679928879;

	/**
	 * Numero de factura
	 **/
	const numero_de_factura = last_voucher+1;

	/**
	 * Numero de CBU del cliente
	 * Es requerido para realizar una factura de crédito electrónica
	 **/
	const CBU = '1234567890123456789012';

	/**
	 * Tipo de Transferencia
	 * Es requerido para realizar una factura de crédito electrónica
	 * SCA = 'TRANSFERENCIA AL SISTEMA DE CIRCULACION ABIERTA'
	 * ADC = 'AGENTE DE DEPOSITO COLECTIVO'
	 **/
	const transferencia = 'ADC';

	/**
	 * Fecha de la factura en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Fecha de vencimiento del pago en formato aaaa-mm-dd
	 **/
	const fecha_vencimiento_pago = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];
	
	/**
	 * Importe de la Factura
	 **/
	const importe_total = 100000;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 6;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	let fecha_servicio_desde = null, fecha_servicio_hasta = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de facturas a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_factura, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_factura,
		'CbteHasta' : numero_de_factura,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : parseInt(fecha_vencimiento_pago.replace(/-/g, '')),
		'ImpTotal' 	: importe_total,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_total,
		'ImpOpEx' 	: 0,
		'ImpIVA' 	: 0,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada en la factura ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos)  
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'Opcionales' : [ // (Opcional) Alícuotas asociadas al comprobante
			{
				'Id'	: 2101, // ID del campo opcion opcional (2101 = CBU)
				'Valor'	: CBU
			},
			{
				'Id': 27, // ID del campo opcion opcional (27 = Transferencia)
				'Valor': transferencia
			}
		],
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de factura
 **/
$tipo_de_factura = 211; // 211 = Factura de Crédito electrónica MiPyMEs (FCE) C

/**
 * Número de la ultima Factura de Crédito electrónica MiPyMEs (FCE) C
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_factura);

/**
 * Concepto de la factura
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 80;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 30679928879;

/**
 * Numero de factura
 **/
$numero_de_factura = $last_voucher+1;

/**
 * Numero de CBU del cliente
 * Es requerido para realizar una factura de crédito electrónica
 **/
$CBU = '1234567890123456789012';

/**
 * Tipo de Transferencia
 * Es requerido para realizar una factura de crédito electrónica
 * SCA = 'TRANSFERENCIA AL SISTEMA DE CIRCULACION ABIERTA'
 * ADC = 'AGENTE DE DEPOSITO COLECTIVO'
 **/
$transferencia = 'ADC';

/**
 * Fecha de la factura en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Fecha de vencimiento del pago en formato aaaa-mm-dd
 **/
$fecha_vencimiento_pago = date('Y-m-d');

/**
 * Importe de la Factura
 **/
$importe_total = 100000;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 6;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
}

$data = array(
	'CantReg' 	=> 1, // Cantidad de facturas a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_factura, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_factura,
	'CbteHasta' => $numero_de_factura,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => intval(str_replace('-', '', $fecha_vencimiento_pago)),
	'ImpTotal' 	=> $importe_total,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_total, // Importe neto
	'ImpOpEx' 	=> 0, // Importe exento al IVA
	'ImpIVA' 	=> 0, // Importe de IVA
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en la factura ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)  
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'Opcionales' => array( // (Opcional) Alícuotas asociadas al comprobante
		array(
			'Id'	=> 2101, // ID del campo opcion opcional (2101 = CBU)
			'Valor'	=> $CBU
		),
		array(
			'Id'	=> 27, // ID del campo opcion opcional (27 = Transferencia)
			'Valor'	=> $transferencia
		)
	),
);

/** 
 * Creamos la Factura 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Factura 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Factura
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_factura = 211 # 211 = Factura de Crédito electrónica MiPyMEs (FCE) C

# Número de la ultima Factura de Crédito electrónica MiPyMEs (FCE) C
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura)

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 30679928879

# Numero de factura
numero_de_factura = last_voucher+1

# Numero de CBU del cliente
# Es requerido para realizar una factura de crédito electrónica
CBU = '1234567890123456789012'

# Tipo de Transferencia
# Es requerido para realizar una factura de crédito electrónica
# SCA = 'TRANSFERENCIA AL SISTEMA DE CIRCULACION ABIERTA'
# ADC = 'AGENTE DE DEPOSITO COLECTIVO'
transferencia = 'ADC'

# Fecha de la factura en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Fecha de vencimiento del pago en formato aaaa-mm-dd
fecha_vencimiento_pago = Time.now.strftime("%Y%m%d").to_i

# Importe de la Factura
importe_total = 100000

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 6

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213
else
  fecha_servicio_desde = nil
  fecha_servicio_hasta = nil
end

data = {
  "CantReg": 1, # Cantidad de facturas a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_factura, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_factura,
  "CbteHasta": numero_de_factura,
  "CbteFch": fecha,	
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha,
  "ImpTotal": importe_total,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_total,
  "ImpOpEx": 0,
  "ImpIVA": 0,
  "ImpTrib": 0, #Importe total de tributos
  "MonId": "PES", #Tipo de moneda usada en la factura ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos)  
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "Opcionales": [ # (Opcional) Alícuotas asociadas al comprobante
    {
      "Id": 2101, # ID del campo opcion opcional (2101 = CBU)
      "Valor": CBU
    },
    {
      "Id": 27, # ID del campo opcion opcional (27 = Transferencia)
      "Valor": transferencia
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

puts {
  "cae" : res["CAE"], # CAE asignado a la Factura
  "vencimiento" : res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_factura = 211 # 211 = Factura de Crédito electrónica MiPyMEs (FCE) C

# Número de la ultima Factura de Crédito electrónica MiPyMEs (FCE) C
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_factura)

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 30679928879

# Numero de factura
numero_de_factura = last_voucher+1

# Numero de CBU del cliente
# Es requerido para realizar una factura de crédito electrónica
CBU = '1234567890123456789012'

# Tipo de Transferencia
# Es requerido para realizar una factura de crédito electrónica
# SCA = 'TRANSFERENCIA AL SISTEMA DE CIRCULACION ABIERTA'
# ADC = 'AGENTE DE DEPOSITO COLECTIVO'
transferencia = 'ADC'

# Fecha de la factura en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Fecha de vencimiento del pago en formato aaaa-mm-dd
fecha_vencimiento_pago = int(datetime.today().strftime("%Y%m%d"))

# Importe de la Factura
importe_total = 100000

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 6

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213
else:
  fecha_servicio_desde = None
  fecha_servicio_hasta = None

data = {
  "CantReg": 1, # Cantidad de facturas a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_factura, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_factura,
  "CbteHasta": numero_de_factura,
  "CbteFch": fecha,	
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha,
  "ImpTotal": importe_total,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_total,
  "ImpOpEx": 0,
  "ImpIVA": 0,
  "ImpTrib": 0, #Importe total de tributos
  "MonId": "PES", #Tipo de moneda usada en la factura ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos)  
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "Opcionales": [ # (Opcional) Alícuotas asociadas al comprobante
    {
      "Id": 2101, # ID del campo opcion opcional (2101 = CBU)
      "Valor": CBU
    },
    {
      "Id": 27, # ID del campo opcion opcional (27 = Transferencia)
      "Valor": transferencia
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

print({
  "cae" : res["CAE"], # CAE asignado a la Factura
  "vencimiento" : res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de factura (211 = Factura de Crédito electrónica MiPyMEs C)
int tipoDeFactura = 211;

// Número de la ultima Factura de Crédito electrónica MiPyMEs C
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeFactura);

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador
long numeroDeDocumento = 30679928879;

// Numero de factura
int numeroDeFactura = lastVoucher + 1;

// Numero de CBU del cliente (requerido para FCE)
string CBU = "1234567890123456789012";

// Tipo de Transferencia (requerido para FCE)
string transferencia = "ADC";

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Fecha de vencimiento del pago en formato aaaammdd
int fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe de la Factura
decimal importeTotal = 100000;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 6;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null;

if (concepto == 2 || concepto == 3)
{
    fechaServicioDesde = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaServicioHasta = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeFactura },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeFactura },
    { "CbteHasta",              numeroDeFactura },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeTotal },
    { "ImpTotConc",             0 },
    { "ImpNeto",                importeTotal },
    { "ImpOpEx",                0 },
    { "ImpIVA",                 0 },
    { "ImpTrib",                0 },
    { "MonId",                  "PES" },
    { "MonCotiz",               1 },
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "Opcionales", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?> { { "Id", 2101 }, { "Valor", CBU } },
            new Dictionary<string, object?> { { "Id", 27 },   { "Valor", transferencia } }
        }
    }
};

// Creamos la Factura
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

Console.WriteLine($"CAE: {res["CAE"]}");
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de factura (211 = Factura de Crédito electrónica MiPyMEs C)
int tipoDeFactura = 211;

// Número de la ultima Factura de Crédito electrónica MiPyMEs C
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeFactura);

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador
long numeroDeDocumento = 30679928879L;

// Numero de factura
int numeroDeFactura = lastVoucher + 1;

// Numero de CBU del cliente (requerido para FCE)
String CBU = "1234567890123456789012";

// Tipo de Transferencia (requerido para FCE)
String transferencia = "ADC";

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Fecha de vencimiento del pago en formato aaaammdd
int fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe de la Factura
double importeTotal = 100000.0;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 6;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null;

if (concepto == 2 || concepto == 3) {
    fechaServicioDesde = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaServicioHasta = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> opCBU = new HashMap<>();
opCBU.put("Id",    2101);
opCBU.put("Valor", CBU);

Map<String, Object> opTransferencia = new HashMap<>();
opTransferencia.put("Id",    27);
opTransferencia.put("Valor", transferencia);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeFactura);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeFactura);
data.put("CbteHasta",             numeroDeFactura);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeTotal);
data.put("ImpTotConc",            0);
data.put("ImpNeto",               importeTotal);
data.put("ImpOpEx",               0);
data.put("ImpIVA",                0);
data.put("ImpTrib",               0);
data.put("MonId",                 "PES");
data.put("MonCotiz",              1);
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("Opcionales",            Arrays.asList(opCBU, opTransferencia));

// Creamos la Factura
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

System.out.println("CAE:         " + res.get("CAE"));
System.out.println("Vencimiento: " + res.get("CAEFchVto"));
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq": {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 211
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 80,
                    "DocNro": 30679928879,
                    "CbteDesde": 3,
                    "CbteHasta": 3,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": 20240314,
                    "ImpTotal": 100000,
                    "ImpTotConc": 0,
                    "ImpNeto": 100000,
                    "ImpOpEx": 0,
                    "ImpIVA": 0,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 6,
                    "Opcionales": {
                        "Opcional": [
                            {
                                "Id": 2101,
                                "Valor": "1234567890123456789012"
                            },
                            {
                                "Id": 27,
                                "Valor": "ADC"
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Nota de Crédito electrónica A

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_nota = 203; // 203 = Nota de Crédito electrónica MiPyME A
	
	/**
	 * Número de la ultima Nota de Crédito electrónica MiPyME A
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota);

	/**
	 * Numero del punto de venta de la Factura 
	 * asociada a la Nota de Crédito
	 **/
	const punto_factura_asociada = 1;

	/**
	 * Tipo de Factura asociada a la Nota de Crédito
	 **/
	const tipo_factura_asociada = 1; // 1 = Factura A

	/**
	 * Numero de Factura asociada a la Nota de Crédito
	 **/
	const numero_factura_asociada = 1;

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 80;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 33693450239;

	/**
	 * Numero de Nota de Crédito
	 **/
	const numero_de_nota = last_voucher+1;

	/**
	 * Fecha de la Nota de Crédito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe sujeto al IVA (sin icluir IVA)
	 **/
	const importe_gravado = 100;

	/**
	 * Importe exento al IVA
	 **/
	const importe_exento_iva = 0;

	/**
	 * Importe de IVA
	 **/
	const importe_iva = 21;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 1;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	let fecha_servicio_desde = null, fecha_servicio_hasta = null, fecha_vencimiento_pago = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;

		/**
		 * Fecha de vencimiento del pago en formato aaaammdd
		 **/
		const fecha_vencimiento_pago = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de Notas de Crédito a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_nota, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_nota,
		'CbteHasta' : numero_de_nota,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : fecha_vencimiento_pago,
		'ImpTotal' 	: importe_gravado + importe_iva + importe_exento_iva,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_gravado,
		'ImpOpEx' 	: importe_exento_iva,
		'ImpIVA' 	: importe_iva,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos) 
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'CbtesAsoc' : [ //Factura asociada
			{
				'Tipo' 		: tipo_factura_asociada,
				'PtoVta' 	: punto_factura_asociada,
				'Nro' 		: numero_factura_asociada,
			}
		],
		'Iva' 		: [ // Alícuotas asociadas a la Nota de Crédito
			{
				'Id' 		: 5, // Id del tipo de IVA (5 = 21%)
				'BaseImp' 	: importe_gravado,
				'Importe' 	: importe_iva 
			}
		]
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de Nota de Crédito
 **/
$tipo_de_nota = 203; // 203 = Nota de Crédito electrónica MiPyME A

/**
 * Número de la ultima Nota de Crédito electrónica MiPyME A
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_nota);

/**
 * Numero del punto de venta de la Factura 
 * asociada a la Nota de Crédito
 **/
$punto_factura_asociada = 1;

/**
 * Tipo de Factura asociada a la Nota de Crédito
 **/
$tipo_factura_asociada = 1; // 1 = Factura A

/**
 * Numero de Factura asociada a la Nota de Crédito
 **/
$numero_factura_asociada = 1;

/**
 * Concepto de la Nota de Crédito
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 80;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 33693450239;

/**
 * Numero de Nota de Crédito
 **/
$numero_de_nota = $last_voucher+1;

/**
 * Fecha de la Nota de Crédito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Importe sujeto al IVA (sin icluir IVA)
 **/
$importe_gravado = 100;

/**
 * Importe exento al IVA
 **/
$importe_exento_iva = 0;

/**
 * Importe de IVA
 **/
$importe_iva = 21;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 1;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));

	/**
	 * Fecha de vencimiento del pago en formato aaaammdd
	 **/
	$fecha_vencimiento_pago = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
	$fecha_vencimiento_pago = null;
}

$data = array(
	'CantReg' 	=> 1, // Cantidad de Notas de Crédito a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_nota, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_nota,
	'CbteHasta' => $numero_de_nota,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => $fecha_vencimiento_pago,
	'ImpTotal' 	=> $importe_gravado + $importe_iva + $importe_exento_iva,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_gravado,
	'ImpOpEx' 	=> $importe_exento_iva,
	'ImpIVA' 	=> $importe_iva,
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en la Nota de Crédito ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'CbtesAsoc' => array( //Factura asociada
		array(
			'Tipo' 		=> $tipo_factura_asociada,
			'PtoVta' 	=> $punto_factura_asociada,
			'Nro' 		=> $numero_factura_asociada,
		)
	),
	'Iva' 		=> array( // Alícuotas asociadas a la Nota de Crédito
		array(
			'Id' 		=> 5, // Id del tipo de IVA (5 = 21%)
			'BaseImp' 	=> $importe_gravado,
			'Importe' 	=> $importe_iva 
		)
	), 
);

/** 
 * Creamos la Nota de Crédito 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Nota de Crédito 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Nota de Crédito
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}
{% code fullWidth="false" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 203 # 203 = Nota de Crédito electrónica MiPyME A

# Número de la ultima Nota de Crédito electrónica MiPyME A
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Crédito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Crédito
tipo_factura_asociada = 1 # 1 = Factura A

# Numero de Factura asociada a la Nota de Crédito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de Nota de Crédito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Crédito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 1

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else 
  fecha_servicio_desde = nil
  fecha_servicio_hasta = nil
  fecha_vencimiento_pago = nil
end

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ],
  "Iva": [ # Alícuotas asociadas a la Nota de Crédito
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
puts {
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endcode %}
{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 203 # 203 = Nota de Crédito electrónica MiPyME A

# Número de la ultima Nota de Crédito electrónica MiPyME A
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Crédito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Crédito
tipo_factura_asociada = 1 # 1 = Factura A

# Numero de Factura asociada a la Nota de Crédito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de Nota de Crédito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Crédito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 1

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else:
  fecha_servicio_desde = None
  fecha_servicio_hasta = None
  fecha_vencimiento_pago = None

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ],
  "Iva": [ # Alícuotas asociadas a la Nota de Crédito
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
print({
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de nota (203 = Nota de Crédito electrónica MiPyME A)
int tipoDeLaNota = 203;

// Número de la ultima Nota de Crédito electrónica MiPyME A
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (1 = Factura A)
int tipoFacturaAsociada = 1;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239;

// Numero de Nota de Crédito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe sujeto al IVA (sin incluir IVA)
decimal importeGravado = 100;

// Importe exento al IVA
decimal importeExentoIva = 0;

// Importe de IVA
decimal importeIva = 21;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 1;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3)
{
    fechaServicioDesde  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaServicioHasta  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeLaNota },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeLaNota },
    { "CbteHasta",              numeroDeLaNota },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeGravado + importeIva + importeExentoIva },
    { "ImpTotConc",             0 },
    { "ImpNeto",                importeGravado },
    { "ImpOpEx",                importeExentoIva },
    { "ImpIVA",                 importeIva },
    { "ImpTrib",                0 },
    { "MonId",                  "PES" },
    { "MonCotiz",               1 },
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "CbtesAsoc", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Tipo",   tipoFacturaAsociada },
                { "PtoVta", puntoFacturaAsociada },
                { "Nro",    numeroFacturaAsociada }
            }
        }
    },
    { "Iva", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Id",      5 },
                { "BaseImp", importeGravado },
                { "Importe", importeIva }
            }
        }
    }
};

// Creamos la Nota de Crédito
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

Console.WriteLine($"CAE: {res["CAE"]}");
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de nota (203 = Nota de Crédito electrónica MiPyME A)
int tipoDeLaNota = 203;

// Número de la ultima Nota de Crédito electrónica MiPyME A
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (1 = Factura A)
int tipoFacturaAsociada = 1;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239L;

// Numero de Nota de Crédito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe sujeto al IVA (sin incluir IVA)
double importeGravado = 100.0;

// Importe exento al IVA
double importeExentoIva = 0;

// Importe de IVA
double importeIva = 21.0;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 1;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3) {
    fechaServicioDesde  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaServicioHasta  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> facturaAsociada = new HashMap<>();
facturaAsociada.put("Tipo",   tipoFacturaAsociada);
facturaAsociada.put("PtoVta", puntoFacturaAsociada);
facturaAsociada.put("Nro",    numeroFacturaAsociada);

Map<String, Object> alicuota = new HashMap<>();
alicuota.put("Id",      5);
alicuota.put("BaseImp", importeGravado);
alicuota.put("Importe", importeIva);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeLaNota);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeLaNota);
data.put("CbteHasta",             numeroDeLaNota);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeGravado + importeIva + importeExentoIva);
data.put("ImpTotConc",            0);
data.put("ImpNeto",               importeGravado);
data.put("ImpOpEx",               importeExentoIva);
data.put("ImpIVA",                importeIva);
data.put("ImpTrib",               0);
data.put("MonId",                 "PES");
data.put("MonCotiz",              1);
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("CbtesAsoc",             Arrays.asList(facturaAsociada));
data.put("Iva",                   Arrays.asList(alicuota));

// Creamos la Nota de Crédito
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

System.out.println("CAE:         " + res.get("CAE"));
System.out.println("Vencimiento: " + res.get("CAEFchVto"));
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq": {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 203
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 80,
                    "DocNro": 33693450239,
                    "CbteDesde": 30,
                    "CbteHasta": 30,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": null,
                    "ImpTotal": 121,
                    "ImpTotConc": 0,
                    "ImpNeto": 100,
                    "ImpOpEx": 0,
                    "ImpIVA": 21,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 1,
                    "CbtesAsoc": {
                        "CbteAsoc": [
                            {
                                "Tipo": 1,
                                "PtoVta": 1,
                                "Nro": 1
                            }
                        ]
                    },
                    "Iva": {
                        "AlicIva": [
                            {
                                "Id": 5,
                                "BaseImp": 100,
                                "Importe": 21
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Nota de Crédito electrónica B

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_nota = 208; // 208 = Nota de Crédito electrónica MiPyME B
	
	/**
	 * Número de la ultima Nota de Crédito electrónica MiPyME B
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota);

	/**
	 * Numero del punto de venta de la Factura 
	 * asociada a la Nota de Crédito
	 **/
	const punto_factura_asociada = 1;

	/**
	 * Tipo de Factura asociada a la Nota de Crédito
	 **/
	const tipo_factura_asociada = 6; // 6 = Factura B

	/**
	 * Numero de Factura asociada a la Nota de Crédito
	 **/
	const numero_factura_asociada = 1;

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 99;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 0;

	/**
	 * Numero de Nota de Crédito
	 **/
	const numero_de_nota = last_voucher+1;

	/**
	 * Fecha de la Nota de Crédito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe sujeto al IVA (sin icluir IVA)
	 **/
	const importe_gravado = 100;

	/**
	 * Importe exento al IVA
	 **/
	const importe_exento_iva = 0;

	/**
	 * Importe de IVA
	 **/
	const importe_iva = 21;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 5;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	let fecha_servicio_desde = null, fecha_servicio_hasta = null, fecha_vencimiento_pago = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;

		/**
		 * Fecha de vencimiento del pago en formato aaaammdd
		 **/
		const fecha_vencimiento_pago = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de Notas de Crédito a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_nota, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_nota,
		'CbteHasta' : numero_de_nota,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : fecha_vencimiento_pago,
		'ImpTotal' 	: importe_gravado + importe_iva + importe_exento_iva,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_gravado,
		'ImpOpEx' 	: importe_exento_iva,
		'ImpIVA' 	: importe_iva,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos) 
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'CbtesAsoc' : [ //Factura asociada
			{
				'Tipo' 		: tipo_factura_asociada,
				'PtoVta' 	: punto_factura_asociada,
				'Nro' 		: numero_factura_asociada,
			}
		],
		'Iva' 		: [ // Alícuotas asociadas a la Nota de Crédito
			{
				'Id' 		: 5, // Id del tipo de IVA (5 = 21%)
				'BaseImp' 	: importe_gravado,
				'Importe' 	: importe_iva 
			}
		]
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de Nota de Crédito
 **/
$tipo_de_nota = 208; // 208 = Nota de Crédito electrónica MiPyME B

/**
 * Número de la ultima Nota de Crédito electrónica MiPyME B
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_nota);

/**
 * Numero del punto de venta de la Factura 
 * asociada a la Nota de Crédito
 **/
$punto_factura_asociada = 1;

/**
 * Tipo de Factura asociada a la Nota de Crédito
 **/
$tipo_factura_asociada = 6; // 6 = Factura B

/**
 * Numero de Factura asociada a la Nota de Crédito
 **/
$numero_factura_asociada = 1;

/**
 * Concepto de la Nota de Crédito
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 99;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 0;

/**
 * Numero de Nota de Crédito
 **/
$numero_de_nota = $last_voucher+1;

/**
 * Fecha de la Nota de Crédito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Importe sujeto al IVA (sin icluir IVA)
 **/
$importe_gravado = 100;

/**
 * Importe exento al IVA
 **/
$importe_exento_iva = 0;

/**
 * Importe de IVA
 **/
$importe_iva = 21;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 5;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));

	/**
	 * Fecha de vencimiento del pago en formato aaaammdd
	 **/
	$fecha_vencimiento_pago = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
	$fecha_vencimiento_pago = null;
}


$data = array(
	'CantReg' 	=> 1, // Cantidad de Notas de Crédito a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_nota, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_nota,
	'CbteHasta' => $numero_de_nota,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => $fecha_vencimiento_pago,
	'ImpTotal' 	=> $importe_gravado + $importe_iva + $importe_exento_iva,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_gravado,
	'ImpOpEx' 	=> $importe_exento_iva,
	'ImpIVA' 	=> $importe_iva,
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en la Nota de Crédito ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)  
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'CbtesAsoc' => array( //Factura asociada
		array(
			'Tipo' 		=> $tipo_factura_asociada,
			'PtoVta' 	=> $punto_factura_asociada,
			'Nro' 		=> $numero_factura_asociada,
		)
	),
	'Iva' 		=> array(// Alícuotas asociadas a la Nota de Crédito
		array(
			'Id' 		=> 5, // Id del tipo de IVA (5 = 21%)
			'BaseImp' 	=> $importe_gravado,
			'Importe' 	=> $importe_iva 
		)
	), 
);

/** 
 * Creamos la Nota de Crédito 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Nota de Crédito 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Nota de Crédito
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 208 # 208 = Nota de Crédito electrónica MiPyME B

# Número de la ultima Nota de Crédito electrónica MiPyME B
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Crédito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Crédito
tipo_factura_asociada = 6 # 6 = Factura B

# Numero de Factura asociada a la Nota de Crédito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 99

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 0

# Numero de Nota de Crédito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Crédito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 5

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else 
  fecha_servicio_desde = nil
  fecha_servicio_hasta = nil
  fecha_vencimiento_pago = nil
end

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ],
  "Iva": [ # Alícuotas asociadas a la Nota de Crédito
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
puts {
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 208 # 208 = Nota de Crédito electrónica MiPyME B

# Número de la ultima Nota de Crédito electrónica MiPyME B
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Crédito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Crédito
tipo_factura_asociada = 6 # 6 = Factura B

# Numero de Factura asociada a la Nota de Crédito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 99

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 0

# Numero de Nota de Crédito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Crédito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 5

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else:
  fecha_servicio_desde = None
  fecha_servicio_hasta = None
  fecha_vencimiento_pago = None

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ],
  "Iva": [ # Alícuotas asociadas a la Nota de Crédito
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
print({
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de nota (208 = Nota de Crédito electrónica MiPyME B)
int tipoDeLaNota = 208;

// Número de la ultima Nota de Crédito electrónica MiPyME B
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (6 = Factura B)
int tipoFacturaAsociada = 6;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 99;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 0;

// Numero de Nota de Crédito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe sujeto al IVA (sin incluir IVA)
decimal importeGravado = 100;
decimal importeExentoIva = 0;
decimal importeIva = 21;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 5;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3)
{
    fechaServicioDesde  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaServicioHasta  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeLaNota },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeLaNota },
    { "CbteHasta",              numeroDeLaNota },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeGravado + importeIva + importeExentoIva },
    { "ImpTotConc",             0 },
    { "ImpNeto",                importeGravado },
    { "ImpOpEx",                importeExentoIva },
    { "ImpIVA",                 importeIva },
    { "ImpTrib",                0 },
    { "MonId",                  "PES" },
    { "MonCotiz",               1 },
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "CbtesAsoc", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Tipo",   tipoFacturaAsociada },
                { "PtoVta", puntoFacturaAsociada },
                { "Nro",    numeroFacturaAsociada }
            }
        }
    },
    { "Iva", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Id",      5 },
                { "BaseImp", importeGravado },
                { "Importe", importeIva }
            }
        }
    }
};

// Creamos la Nota de Crédito
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

Console.WriteLine($"CAE: {res["CAE"]}");
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de nota (208 = Nota de Crédito electrónica MiPyME B)
int tipoDeLaNota = 208;

// Número de la ultima Nota de Crédito electrónica MiPyME B
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (6 = Factura B)
int tipoFacturaAsociada = 6;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 99;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 0;

// Numero de Nota de Crédito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe sujeto al IVA (sin incluir IVA)
double importeGravado = 100.0;
double importeExentoIva = 0;
double importeIva = 21.0;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 5;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3) {
    fechaServicioDesde  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaServicioHasta  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> facturaAsociada = new HashMap<>();
facturaAsociada.put("Tipo",   tipoFacturaAsociada);
facturaAsociada.put("PtoVta", puntoFacturaAsociada);
facturaAsociada.put("Nro",    numeroFacturaAsociada);

Map<String, Object> alicuota = new HashMap<>();
alicuota.put("Id",      5);
alicuota.put("BaseImp", importeGravado);
alicuota.put("Importe", importeIva);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeLaNota);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeLaNota);
data.put("CbteHasta",             numeroDeLaNota);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeGravado + importeIva + importeExentoIva);
data.put("ImpTotConc",            0);
data.put("ImpNeto",               importeGravado);
data.put("ImpOpEx",               importeExentoIva);
data.put("ImpIVA",                importeIva);
data.put("ImpTrib",               0);
data.put("MonId",                 "PES");
data.put("MonCotiz",              1);
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("CbtesAsoc",             Arrays.asList(facturaAsociada));
data.put("Iva",                   Arrays.asList(alicuota));

// Creamos la Nota de Crédito
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

System.out.println("CAE:         " + res.get("CAE"));
System.out.println("Vencimiento: " + res.get("CAEFchVto"));
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq": {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 208
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 99,
                    "DocNro": 0,
                    "CbteDesde": 15,
                    "CbteHasta": 15,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": null,
                    "ImpTotal": 121,
                    "ImpTotConc": 0,
                    "ImpNeto": 100,
                    "ImpOpEx": 0,
                    "ImpIVA": 21,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 5,
                    "CbtesAsoc": {
                        "CbteAsoc": [
                            {
                                "Tipo": 6,
                                "PtoVta": 1,
                                "Nro": 1
                            }
                        ]
                    },
                    "Iva": {
                        "AlicIva": [
                            {
                                "Id": 5,
                                "BaseImp": 100,
                                "Importe": 21
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Nota de Crédito electrónica C

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_nota = 213; // 213 = Nota de Crédito electrónica MiPyME C
	
	/**
	 * Número de la ultima Nota de Crédito electrónica MiPyME C
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota);

	/**
	 * Numero del punto de venta de la Factura 
	 * asociada a la Nota de Crédito
	 **/
	const punto_factura_asociada = 1;

	/**
	 * Tipo de Factura asociada a la Nota de Crédito
	 **/
	const tipo_factura_asociada = 11; // 11 = Factura C

	/**
	 * Numero de Factura asociada a la Nota de Crédito
	 **/
	const numero_factura_asociada = 1;

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 80;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 33693450239;

	/**
	 * Numero de Nota de Crédito
	 **/
	const numero_de_nota = last_voucher+1;

	/**
	 * Fecha de la Nota de Crédito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe de la Nota de Crédito
	 **/
	const importe_total = 100;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 6;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	let fecha_servicio_desde = null, fecha_servicio_hasta = null, fecha_vencimiento_pago = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;

		/**
		 * Fecha de vencimiento del pago en formato aaaammdd
		 **/
		const fecha_vencimiento_pago = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de Notas de Crédito a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_nota, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_nota,
		'CbteHasta' : numero_de_nota,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : fecha_vencimiento_pago,
		'ImpTotal' 	: importe_total,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_total,
		'ImpOpEx' 	: 0,
		'ImpIVA' 	: 0,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos) 
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'CbtesAsoc' : [ //Factura asociada
			{
				'Tipo' 		: tipo_factura_asociada,
				'PtoVta' 	: punto_factura_asociada,
				'Nro' 		: numero_factura_asociada,
			}
		]
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de Nota de Crédito
 **/
$tipo_de_nota = 213; // 213 = Nota de Crédito electrónica MiPyME C

/**
 * Número de la ultima Nota de Crédito electrónica MiPyME C
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_nota);

/**
 * Numero del punto de venta de la Factura 
 * asociada a la Nota de Crédito
 **/
$punto_factura_asociada = 1;

/**
 * Tipo de Factura asociada a la Nota de Crédito
 **/
$tipo_factura_asociada = 11; // 11 = Factura C

/**
 * Numero de Factura asociada a la Nota de Crédito
 **/
$numero_factura_asociada = 1;

/**
 * Concepto de la Nota de Crédito
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 80;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 33693450239;

/**
 * Numero de comprobante
 **/
$numero_de_nota = $last_voucher+1;

/**
 * Fecha de la Nota de Crédito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Importe de la Nota de Crédito
 **/
$importe_total = 100;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 6;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));

	/**
	 * Fecha de vencimiento del pago en formato aaaammdd
	 **/
	$fecha_vencimiento_pago = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
	$fecha_vencimiento_pago = null;
}


$data = array(
	'CantReg' 	=> 1, // Cantidad de Notas de Crédito a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_nota, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_nota,
	'CbteHasta' => $numero_de_nota,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => $fecha_vencimiento_pago,
	'ImpTotal' 	=> $importe_total,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_total, // Importe neto
	'ImpOpEx' 	=> 0, // Importe exento al IVA
	'ImpIVA' 	=> 0, // Importe de IVA
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en el comprobante ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)  
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'CbtesAsoc' => array( //Factura asociada
		array(
			'Tipo' 		=> $tipo_factura_asociada,
			'PtoVta' 	=> $punto_factura_asociada,
			'Nro' 		=> $numero_factura_asociada,
		)
	)
);

/** 
 * Creamos la Nota de Crédito 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Nota de Crédito 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Nota de Crédito
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 213 # 213 = Nota de Crédito electrónica MiPyME C

# Número de la ultima Nota de Crédito electrónica MiPyME C
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Crédito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Crédito
tipo_factura_asociada = 11 # 11 = Factura B

# Numero de Factura asociada a la Nota de Crédito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de Nota de Crédito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Crédito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Importe de la Nota de Crédito
importe_total = 100

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 6

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else 
  fecha_servicio_desde = nil
  fecha_servicio_hasta = nil
  fecha_vencimiento_pago = nil
end

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_total,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_total,
  "ImpOpEx": 0,
  "ImpIVA": 0,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
puts {
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 213 # 213 = Nota de Crédito electrónica MiPyME C

# Número de la ultima Nota de Crédito electrónica MiPyME C
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Crédito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Crédito
tipo_factura_asociada = 11 # 11 = Factura B

# Numero de Factura asociada a la Nota de Crédito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de Nota de Crédito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Crédito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Importe de la Nota de Crédito
importe_total = 100

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 6

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else:
  fecha_servicio_desde = None
  fecha_servicio_hasta = None
  fecha_vencimiento_pago = None

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_total,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_total,
  "ImpOpEx": 0,
  "ImpIVA": 0,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
print({
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de nota (213 = Nota de Crédito electrónica MiPyME C)
int tipoDeLaNota = 213;

// Número de la ultima Nota de Crédito electrónica MiPyME C
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (11 = Factura C)
int tipoFacturaAsociada = 11;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239;

// Numero de Nota de Crédito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe de la Nota de Crédito
decimal importeTotal = 100;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 6;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3)
{
    fechaServicioDesde  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaServicioHasta  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeLaNota },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeLaNota },
    { "CbteHasta",              numeroDeLaNota },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeTotal },
    { "ImpTotConc",             0 },
    { "ImpNeto",                importeTotal },
    { "ImpOpEx",                0 },
    { "ImpIVA",                 0 },
    { "ImpTrib",                0 },
    { "MonId",                  "PES" },
    { "MonCotiz",               1 },
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "CbtesAsoc", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Tipo",   tipoFacturaAsociada },
                { "PtoVta", puntoFacturaAsociada },
                { "Nro",    numeroFacturaAsociada }
            }
        }
    }
};

// Creamos la Nota de Crédito
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

Console.WriteLine($"CAE: {res["CAE"]}");
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de nota (213 = Nota de Crédito electrónica MiPyME C)
int tipoDeLaNota = 213;

// Número de la ultima Nota de Crédito electrónica MiPyME C
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (11 = Factura C)
int tipoFacturaAsociada = 11;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239L;

// Numero de Nota de Crédito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe de la Nota de Crédito
double importeTotal = 100.0;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 6;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3) {
    fechaServicioDesde  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaServicioHasta  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> facturaAsociada = new HashMap<>();
facturaAsociada.put("Tipo",   tipoFacturaAsociada);
facturaAsociada.put("PtoVta", puntoFacturaAsociada);
facturaAsociada.put("Nro",    numeroFacturaAsociada);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeLaNota);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeLaNota);
data.put("CbteHasta",             numeroDeLaNota);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeTotal);
data.put("ImpTotConc",            0);
data.put("ImpNeto",               importeTotal);
data.put("ImpOpEx",               0);
data.put("ImpIVA",                0);
data.put("ImpTrib",               0);
data.put("MonId",                 "PES");
data.put("MonCotiz",              1);
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("CbtesAsoc",             Arrays.asList(facturaAsociada));

// Creamos la Nota de Crédito
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

System.out.println("CAE:         " + res.get("CAE"));
System.out.println("Vencimiento: " + res.get("CAEFchVto"));
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq": {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 213
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 80,
                    "DocNro": 33693450239,
                    "CbteDesde": 9,
                    "CbteHasta": 9,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": null,
                    "ImpTotal": 100,
                    "ImpTotConc": 0,
                    "ImpNeto": 100,
                    "ImpOpEx": 0,
                    "ImpIVA": 0,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 6,
                    "CbtesAsoc": {
                        "CbteAsoc": [
                            {
                                "Tipo": 11,
                                "PtoVta": 1,
                                "Nro": 1
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Nota de Débito electrónica A

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_nota = 202; // 202 = Nota de Débito electrónica MiPyME A
	
	/**
	 * Número de la ultima Nota de Débito electrónica MiPyME A
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota);

	/**
	 * Numero del punto de venta de la Factura 
	 * asociada a la Nota de Débito
	 **/
	const punto_factura_asociada = 1;

	/**
	 * Tipo de Factura asociada a la Nota de Débito
	 **/
	const tipo_factura_asociada = 1; // 1 = Factura A

	/**
	 * Numero de Factura asociada a la Nota de Débito
	 **/
	const numero_factura_asociada = 1;

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 80;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 33693450239;

	/**
	 * Numero de Nota de Débito
	 **/
	const numero_de_nota = last_voucher+1;

	/**
	 * Fecha de la Nota de Débito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe sujeto al IVA (sin icluir IVA)
	 **/
	const importe_gravado = 100;

	/**
	 * Importe exento al IVA
	 **/
	const importe_exento_iva = 0;

	/**
	 * Importe de IVA
	 **/
	const importe_iva = 21;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 1;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	let fecha_servicio_desde = null, fecha_servicio_hasta = null, fecha_vencimiento_pago = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;

		/**
		 * Fecha de vencimiento del pago en formato aaaammdd
		 **/
		const fecha_vencimiento_pago = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de Notas de Crédito a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_nota, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_nota,
		'CbteHasta' : numero_de_nota,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : fecha_vencimiento_pago,
		'ImpTotal' 	: importe_gravado + importe_iva + importe_exento_iva,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_gravado,
		'ImpOpEx' 	: importe_exento_iva,
		'ImpIVA' 	: importe_iva,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos) 
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'CbtesAsoc' : [ //Factura asociada
			{
				'Tipo' 		: tipo_factura_asociada,
				'PtoVta' 	: punto_factura_asociada,
				'Nro' 		: numero_factura_asociada,
			}
		],
		'Iva' 		: [ // Alícuotas asociadas a la Nota de Débito
			{
				'Id' 		: 5, // Id del tipo de IVA (5 = 21%)
				'BaseImp' 	: importe_gravado,
				'Importe' 	: importe_iva 
			}
		]
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de Nota de Débito
 **/
$tipo_de_nota = 202; // 202 = Nota de Débito electrónica MiPyME A

/**
 * Número de la ultima Nota de Débito electrónica MiPyME A
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_nota);

/**
 * Numero del punto de venta de la Factura 
 * asociada a la Nota de Débito
 **/
$punto_factura_asociada = 1;

/**
 * Tipo de Factura asociada a la Nota de Débito
 **/
$tipo_factura_asociada = 1; // 1 = Factura A

/**
 * Numero de Factura asociada a la Nota de Débito
 **/
$numero_factura_asociada = 1;

/**
 * Concepto de la Nota de Débito
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 80;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 33693450239;

/**
 * Numero de Nota de Débito
 **/
$numero_de_nota = $last_voucher+1;

/**
 * Fecha de la Nota de Débito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Importe sujeto al IVA (sin icluir IVA)
 **/
$importe_gravado = 100;

/**
 * Importe exento al IVA
 **/
$importe_exento_iva = 0;

/**
 * Importe de IVA
 **/
$importe_iva = 21;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 1;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));

	/**
	 * Fecha de vencimiento del pago en formato aaaammdd
	 **/
	$fecha_vencimiento_pago = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
	$fecha_vencimiento_pago = null;
}

$data = array(
	'CantReg' 	=> 1, // Cantidad de Notas de Crédito a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_nota, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_nota,
	'CbteHasta' => $numero_de_nota,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => $fecha_vencimiento_pago,
	'ImpTotal' 	=> $importe_gravado + $importe_iva + $importe_exento_iva,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_gravado,
	'ImpOpEx' 	=> $importe_exento_iva,
	'ImpIVA' 	=> $importe_iva,
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en la Nota de Débito ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'CbtesAsoc' => array( //Factura asociada
		array(
			'Tipo' 		=> $tipo_factura_asociada,
			'PtoVta' 	=> $punto_factura_asociada,
			'Nro' 		=> $numero_factura_asociada,
		)
	),
	'Iva' 		=> array( // Alícuotas asociadas a la Nota de Débito
		array(
			'Id' 		=> 5, // Id del tipo de IVA (5 = 21%)
			'BaseImp' 	=> $importe_gravado,
			'Importe' 	=> $importe_iva 
		)
	), 
);

/** 
 * Creamos la Nota de Débito 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Nota de Débito 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Nota de Débito
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}
{% code fullWidth="false" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 202 # 202 = Nota de Débito electrónica MiPyME A

# Número de la ultima Nota de Débito electrónica MiPyME A
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Débito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Débito
tipo_factura_asociada = 1 # 1 = Factura A

# Numero de Factura asociada a la Nota de Débito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de Nota de Débito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Débito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 1

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else 
  fecha_servicio_desde = nil
  fecha_servicio_hasta = nil
  fecha_vencimiento_pago = nil
end

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ],
  "Iva": [ # Alícuotas asociadas a la Nota de Débito
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
puts {
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endcode %}
{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 202 # 202 = Nota de Débito electrónica MiPyME A

# Número de la ultima Nota de Débito electrónica MiPyME A
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Débito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Débito
tipo_factura_asociada = 1 # 1 = Factura A

# Numero de Factura asociada a la Nota de Débito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de Nota de Débito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Débito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 1

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else:
  fecha_servicio_desde = None
  fecha_servicio_hasta = None
  fecha_vencimiento_pago = None

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ],
  "Iva": [ # Alícuotas asociadas a la Nota de Débito
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
print({
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de nota (202 = Nota de Débito electrónica MiPyME A)
int tipoDeLaNota = 202;

// Número de la ultima Nota de Débito electrónica MiPyME A
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (1 = Factura A)
int tipoFacturaAsociada = 1;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239;

// Numero de Nota de Débito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe sujeto al IVA (sin incluir IVA)
decimal importeGravado = 100;
decimal importeExentoIva = 0;
decimal importeIva = 21;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 1;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3)
{
    fechaServicioDesde  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaServicioHasta  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeLaNota },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeLaNota },
    { "CbteHasta",              numeroDeLaNota },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeGravado + importeIva + importeExentoIva },
    { "ImpTotConc",             0 },
    { "ImpNeto",                importeGravado },
    { "ImpOpEx",                importeExentoIva },
    { "ImpIVA",                 importeIva },
    { "ImpTrib",                0 },
    { "MonId",                  "PES" },
    { "MonCotiz",               1 },
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "CbtesAsoc", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Tipo",   tipoFacturaAsociada },
                { "PtoVta", puntoFacturaAsociada },
                { "Nro",    numeroFacturaAsociada }
            }
        }
    },
    { "Iva", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Id",      5 },
                { "BaseImp", importeGravado },
                { "Importe", importeIva }
            }
        }
    }
};

// Creamos la Nota de Débito
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

Console.WriteLine($"CAE: {res["CAE"]}");
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de nota (202 = Nota de Débito electrónica MiPyME A)
int tipoDeLaNota = 202;

// Número de la ultima Nota de Débito electrónica MiPyME A
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (1 = Factura A)
int tipoFacturaAsociada = 1;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239L;

// Numero de Nota de Débito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe sujeto al IVA (sin incluir IVA)
double importeGravado = 100.0;
double importeExentoIva = 0;
double importeIva = 21.0;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 1;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3) {
    fechaServicioDesde  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaServicioHasta  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> facturaAsociada = new HashMap<>();
facturaAsociada.put("Tipo",   tipoFacturaAsociada);
facturaAsociada.put("PtoVta", puntoFacturaAsociada);
facturaAsociada.put("Nro",    numeroFacturaAsociada);

Map<String, Object> alicuota = new HashMap<>();
alicuota.put("Id",      5);
alicuota.put("BaseImp", importeGravado);
alicuota.put("Importe", importeIva);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeLaNota);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeLaNota);
data.put("CbteHasta",             numeroDeLaNota);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeGravado + importeIva + importeExentoIva);
data.put("ImpTotConc",            0);
data.put("ImpNeto",               importeGravado);
data.put("ImpOpEx",               importeExentoIva);
data.put("ImpIVA",                importeIva);
data.put("ImpTrib",               0);
data.put("MonId",                 "PES");
data.put("MonCotiz",              1);
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("CbtesAsoc",             Arrays.asList(facturaAsociada));
data.put("Iva",                   Arrays.asList(alicuota));

// Creamos la Nota de Débito
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

System.out.println("CAE:         " + res.get("CAE"));
System.out.println("Vencimiento: " + res.get("CAEFchVto"));
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq": {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 202
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 80,
                    "DocNro": 33693450239,
                    "CbteDesde": 30,
                    "CbteHasta": 30,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": null,
                    "ImpTotal": 121,
                    "ImpTotConc": 0,
                    "ImpNeto": 100,
                    "ImpOpEx": 0,
                    "ImpIVA": 21,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 1,
                    "CbtesAsoc": {
                        "CbteAsoc": [
                            {
                                "Tipo": 1,
                                "PtoVta": 1,
                                "Nro": 1
                            }
                        ]
                    },
                    "Iva": {
                        "AlicIva": [
                            {
                                "Id": 5,
                                "BaseImp": 100,
                                "Importe": 21
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Nota de Débito electrónica B

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_nota = 207; // 207 = Nota de Débito electrónica MiPyME B
	
	/**
	 * Número de la ultima Nota de Débito electrónica MiPyME B
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota);

	/**
	 * Numero del punto de venta de la Factura 
	 * asociada a la Nota de Débito
	 **/
	const punto_factura_asociada = 1;

	/**
	 * Tipo de Factura asociada a la Nota de Débito
	 **/
	const tipo_factura_asociada = 6; // 6 = Factura B

	/**
	 * Numero de Factura asociada a la Nota de Débito
	 **/
	const numero_factura_asociada = 1;

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 99;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 0;

	/**
	 * Numero de Nota de Débito
	 **/
	const numero_de_nota = last_voucher+1;

	/**
	 * Fecha de la Nota de Débito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe sujeto al IVA (sin icluir IVA)
	 **/
	const importe_gravado = 100;

	/**
	 * Importe exento al IVA
	 **/
	const importe_exento_iva = 0;

	/**
	 * Importe de IVA
	 **/
	const importe_iva = 21;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 5;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	let fecha_servicio_desde = null, fecha_servicio_hasta = null, fecha_vencimiento_pago = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;

		/**
		 * Fecha de vencimiento del pago en formato aaaammdd
		 **/
		const fecha_vencimiento_pago = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de Notas de Crédito a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_nota, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_nota,
		'CbteHasta' : numero_de_nota,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : fecha_vencimiento_pago,
		'ImpTotal' 	: importe_gravado + importe_iva + importe_exento_iva,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_gravado,
		'ImpOpEx' 	: importe_exento_iva,
		'ImpIVA' 	: importe_iva,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos) 
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'CbtesAsoc' : [ //Factura asociada
			{
				'Tipo' 		: tipo_factura_asociada,
				'PtoVta' 	: punto_factura_asociada,
				'Nro' 		: numero_factura_asociada,
			}
		],
		'Iva' 		: [ // Alícuotas asociadas a la Nota de Débito
			{
				'Id' 		: 5, // Id del tipo de IVA (5 = 21%)
				'BaseImp' 	: importe_gravado,
				'Importe' 	: importe_iva 
			}
		]
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de Nota de Débito
 **/
$tipo_de_nota = 207; // 207 = Nota de Débito electrónica MiPyME B

/**
 * Número de la ultima Nota de Débito electrónica MiPyME B
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_nota);

/**
 * Numero del punto de venta de la Factura 
 * asociada a la Nota de Débito
 **/
$punto_factura_asociada = 1;

/**
 * Tipo de Factura asociada a la Nota de Débito
 **/
$tipo_factura_asociada = 6; // 6 = Factura B

/**
 * Numero de Factura asociada a la Nota de Débito
 **/
$numero_factura_asociada = 1;

/**
 * Concepto de la Nota de Débito
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 99;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 0;

/**
 * Numero de Nota de Débito
 **/
$numero_de_nota = $last_voucher+1;

/**
 * Fecha de la Nota de Débito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Importe sujeto al IVA (sin icluir IVA)
 **/
$importe_gravado = 100;

/**
 * Importe exento al IVA
 **/
$importe_exento_iva = 0;

/**
 * Importe de IVA
 **/
$importe_iva = 21;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 5;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));

	/**
	 * Fecha de vencimiento del pago en formato aaaammdd
	 **/
	$fecha_vencimiento_pago = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
	$fecha_vencimiento_pago = null;
}


$data = array(
	'CantReg' 	=> 1, // Cantidad de Notas de Crédito a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_nota, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_nota,
	'CbteHasta' => $numero_de_nota,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => $fecha_vencimiento_pago,
	'ImpTotal' 	=> $importe_gravado + $importe_iva + $importe_exento_iva,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_gravado,
	'ImpOpEx' 	=> $importe_exento_iva,
	'ImpIVA' 	=> $importe_iva,
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en la Nota de Débito ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)  
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'CbtesAsoc' => array( //Factura asociada
		array(
			'Tipo' 		=> $tipo_factura_asociada,
			'PtoVta' 	=> $punto_factura_asociada,
			'Nro' 		=> $numero_factura_asociada,
		)
	),
	'Iva' 		=> array(// Alícuotas asociadas a la Nota de Débito
		array(
			'Id' 		=> 5, // Id del tipo de IVA (5 = 21%)
			'BaseImp' 	=> $importe_gravado,
			'Importe' 	=> $importe_iva 
		)
	), 
);

/** 
 * Creamos la Nota de Débito 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Nota de Débito 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Nota de Débito
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 207 # 207 = Nota de Débito electrónica MiPyME B

# Número de la ultima Nota de Débito electrónica MiPyME B
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Débito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Débito
tipo_factura_asociada = 6 # 6 = Factura B

# Numero de Factura asociada a la Nota de Débito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 99

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 0

# Numero de Nota de Débito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Débito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 5

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else 
  fecha_servicio_desde = nil
  fecha_servicio_hasta = nil
  fecha_vencimiento_pago = nil
end

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ],
  "Iva": [ # Alícuotas asociadas a la Nota de Débito
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
puts {
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 207 # 207 = Nota de Débito electrónica MiPyME B

# Número de la ultima Nota de Débito electrónica MiPyME B
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Débito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Débito
tipo_factura_asociada = 6 # 6 = Factura B

# Numero de Factura asociada a la Nota de Débito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 99

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 0

# Numero de Nota de Débito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Débito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Importe sujeto al IVA (sin icluir IVA)
importe_gravado = 100

# Importe exento al IVA
importe_exento_iva = 0

# Importe de IVA
importe_iva = 21

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 5

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else:
  fecha_servicio_desde = None
  fecha_servicio_hasta = None
  fecha_vencimiento_pago = None

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_gravado + importe_iva + importe_exento_iva,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_gravado,
  "ImpOpEx": importe_exento_iva,
  "ImpIVA": importe_iva,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ],
  "Iva": [ # Alícuotas asociadas a la Nota de Débito
    {
      "Id": 5, # Id del tipo de IVA (5 = 21%)
      "BaseImp": importe_gravado,
      "Importe": importe_iva 
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
print({
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de nota (207 = Nota de Débito electrónica MiPyME B)
int tipoDeLaNota = 207;

// Número de la ultima Nota de Débito electrónica MiPyME B
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (6 = Factura B)
int tipoFacturaAsociada = 6;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 99;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 0;

// Numero de Nota de Débito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe sujeto al IVA (sin incluir IVA)
decimal importeGravado = 100;
decimal importeExentoIva = 0;
decimal importeIva = 21;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 5;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3)
{
    fechaServicioDesde  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaServicioHasta  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeLaNota },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeLaNota },
    { "CbteHasta",              numeroDeLaNota },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeGravado + importeIva + importeExentoIva },
    { "ImpTotConc",             0 },
    { "ImpNeto",                importeGravado },
    { "ImpOpEx",                importeExentoIva },
    { "ImpIVA",                 importeIva },
    { "ImpTrib",                0 },
    { "MonId",                  "PES" },
    { "MonCotiz",               1 },
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "CbtesAsoc", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Tipo",   tipoFacturaAsociada },
                { "PtoVta", puntoFacturaAsociada },
                { "Nro",    numeroFacturaAsociada }
            }
        }
    },
    { "Iva", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Id",      5 },
                { "BaseImp", importeGravado },
                { "Importe", importeIva }
            }
        }
    }
};

// Creamos la Nota de Débito
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

Console.WriteLine($"CAE: {res["CAE"]}");
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de nota (207 = Nota de Débito electrónica MiPyME B)
int tipoDeLaNota = 207;

// Número de la ultima Nota de Débito electrónica MiPyME B
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (6 = Factura B)
int tipoFacturaAsociada = 6;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 99;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 0;

// Numero de Nota de Débito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe sujeto al IVA (sin incluir IVA)
double importeGravado = 100.0;
double importeExentoIva = 0;
double importeIva = 21.0;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 5;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3) {
    fechaServicioDesde  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaServicioHasta  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> facturaAsociada = new HashMap<>();
facturaAsociada.put("Tipo",   tipoFacturaAsociada);
facturaAsociada.put("PtoVta", puntoFacturaAsociada);
facturaAsociada.put("Nro",    numeroFacturaAsociada);

Map<String, Object> alicuota = new HashMap<>();
alicuota.put("Id",      5);
alicuota.put("BaseImp", importeGravado);
alicuota.put("Importe", importeIva);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeLaNota);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeLaNota);
data.put("CbteHasta",             numeroDeLaNota);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeGravado + importeIva + importeExentoIva);
data.put("ImpTotConc",            0);
data.put("ImpNeto",               importeGravado);
data.put("ImpOpEx",               importeExentoIva);
data.put("ImpIVA",                importeIva);
data.put("ImpTrib",               0);
data.put("MonId",                 "PES");
data.put("MonCotiz",              1);
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("CbtesAsoc",             Arrays.asList(facturaAsociada));
data.put("Iva",                   Arrays.asList(alicuota));

// Creamos la Nota de Débito
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

System.out.println("CAE:         " + res.get("CAE"));
System.out.println("Vencimiento: " + res.get("CAEFchVto"));
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq": {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 207
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 99,
                    "DocNro": 0,
                    "CbteDesde": 15,
                    "CbteHasta": 15,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": null,
                    "ImpTotal": 121,
                    "ImpTotConc": 0,
                    "ImpNeto": 100,
                    "ImpOpEx": 0,
                    "ImpIVA": 21,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 5,
                    "CbtesAsoc": {
                        "CbteAsoc": [
                            {
                                "Tipo": 6,
                                "PtoVta": 1,
                                "Nro": 1
                            }
                        ]
                    },
                    "Iva": {
                        "AlicIva": [
                            {
                                "Id": 5,
                                "BaseImp": 100,
                                "Importe": 21
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Nota de Débito electrónica C

{% tabs %}
{% tab title="Node" %}

```javascript
(async () => {
	/**
	 * Numero del punto de venta
	 **/
	const punto_de_venta = 1;

	/**
	 * Tipo de factura
	 **/
	const tipo_de_nota = 212; // 212 = Nota de Débito electrónica MiPyME C
	
	/**
	 * Número de la ultima Nota de Débito electrónica MiPyME C
	 **/
	const last_voucher = await afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota);

	/**
	 * Numero del punto de venta de la Factura 
	 * asociada a la Nota de Débito
	 **/
	const punto_factura_asociada = 1;

	/**
	 * Tipo de Factura asociada a la Nota de Débito
	 **/
	const tipo_factura_asociada = 11; // 11 = Factura C

	/**
	 * Numero de Factura asociada a la Nota de Débito
	 **/
	const numero_factura_asociada = 1;

	/**
	 * Concepto de la factura
	 *
	 * Opciones:
	 *
	 * 1 = Productos 
	 * 2 = Servicios 
	 * 3 = Productos y Servicios
	 **/
	const concepto = 1;

	/**
	 * Tipo de documento del comprador
	 *
	 * Opciones:
	 *
	 * 80 = CUIT 
	 * 86 = CUIL 
	 * 96 = DNI
	 * 99 = Consumidor Final 
	 **/
	const tipo_de_documento = 80;

	/**
	 * Numero de documento del comprador (0 para consumidor final)
	 **/
	const numero_de_documento = 33693450239;

	/**
	 * Numero de Nota de Débito
	 **/
	const numero_de_nota = last_voucher+1;

	/**
	 * Fecha de la Nota de Débito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
	 **/
	const fecha = new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0];

	/**
	 * Importe de la Nota de Débito
	 **/
	const importe_total = 100;

	/**
	 * Condición frente al IVA del receptor
	 * 
	 * 1 = IVA Responsable Inscripto
	 * 4 = IVA Sujeto Exento
	 * 5 = Consumidor Final
	 * 6 = Responsable Monotributo
	 * 7 = Sujeto No Categorizado
	 * 8 = Proveedor del Exterior
	 * 9 = Cliente del Exterior
	 * 10 = IVA Liberado – Ley N° 19.640
	 * 13 = Monotributista Social
	 * 15 = IVA No Alcanzado
	 * 16 = Monotributo Trabajador Independiente Promovido
	 **/
	const condicion_iva_receptor = 6;

	/**
	 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
	 **/
	let fecha_servicio_desde = null, fecha_servicio_hasta = null, fecha_vencimiento_pago = null;
	
	if (concepto === 2 || concepto === 3) {
		/**
		 * Fecha de inicio de servicio en formato aaaammdd
		 **/
		const fecha_servicio_desde = 20191213;

		/**
		 * Fecha de fin de servicio en formato aaaammdd
		 **/
		const fecha_servicio_hasta = 20191213;

		/**
		 * Fecha de vencimiento del pago en formato aaaammdd
		 **/
		const fecha_vencimiento_pago = 20191213;
	}

	const data = {
		'CantReg' 	: 1, // Cantidad de Notas de Crédito a registrar
		'PtoVta' 	: punto_de_venta,
		'CbteTipo' 	: tipo_de_nota, 
		'Concepto' 	: concepto,
		'DocTipo' 	: tipo_de_documento,
		'DocNro' 	: numero_de_documento,
		'CbteDesde' : numero_de_nota,
		'CbteHasta' : numero_de_nota,
		'CbteFch' 	: parseInt(fecha.replace(/-/g, '')),	
		'FchServDesde'  : fecha_servicio_desde,
		'FchServHasta'  : fecha_servicio_hasta,
		'FchVtoPago'    : fecha_vencimiento_pago,
		'ImpTotal' 	: importe_total,
		'ImpTotConc': 0, // Importe neto no gravado
		'ImpNeto' 	: importe_total,
		'ImpOpEx' 	: 0,
		'ImpIVA' 	: 0,
		'ImpTrib' 	: 0, //Importe total de tributos
		'MonId' 	: 'PES', //Tipo de moneda usada ('PES' = pesos argentinos) 
		'MonCotiz' 	: 1, // Cotización de la moneda usada (1 para pesos argentinos) 
		'CondicionIVAReceptorId' : condicion_iva_receptor, 
		'CbtesAsoc' : [ //Factura asociada
			{
				'Tipo' 		: tipo_factura_asociada,
				'PtoVta' 	: punto_factura_asociada,
				'Nro' 		: numero_factura_asociada,
			}
		]
	};

	/** 
	 * Creamos la Factura 
	 **/
	const res = await afip.ElectronicBilling.createVoucher(data);

	/**
	 * Mostramos por pantalla los datos de la nueva Factura 
	 **/
	console.log({
		'cae' : res.CAE, //CAE asignado a la Factura
		'vencimiento' : res.CAEFchVto //Fecha de vencimiento del CAE
	});
})()
```

{% endtab %}

{% tab title="PHP" %}

```php
/**
 * Numero del punto de venta
 **/
$punto_de_venta = 1;

/**
 * Tipo de Nota de Débito
 **/
$tipo_de_nota = 212; // 212 = Nota de Débito electrónica MiPyME C

/**
 * Número de la ultima Nota de Débito electrónica MiPyME C
 **/
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_nota);

/**
 * Numero del punto de venta de la Factura 
 * asociada a la Nota de Débito
 **/
$punto_factura_asociada = 1;

/**
 * Tipo de Factura asociada a la Nota de Débito
 **/
$tipo_factura_asociada = 11; // 11 = Factura C

/**
 * Numero de Factura asociada a la Nota de Débito
 **/
$numero_factura_asociada = 1;

/**
 * Concepto de la Nota de Débito
 *
 * Opciones:
 *
 * 1 = Productos 
 * 2 = Servicios 
 * 3 = Productos y Servicios
 **/
$concepto = 1;

/**
 * Tipo de documento del comprador
 *
 * Opciones:
 *
 * 80 = CUIT 
 * 86 = CUIL 
 * 96 = DNI
 * 99 = Consumidor Final 
 **/
$tipo_de_documento = 80;

/**
 * Numero de documento del comprador (0 para consumidor final)
 **/
$numero_de_documento = 33693450239;

/**
 * Numero de comprobante
 **/
$numero_de_nota = $last_voucher+1;

/**
 * Fecha de la Nota de Débito en formato aaaa-mm-dd (hasta 10 dias antes y 10 dias despues)
 **/
$fecha = date('Y-m-d');

/**
 * Importe de la Nota de Débito
 **/
$importe_total = 100;

/**
 * Condición frente al IVA del receptor
 * 
 * Opciones:
 * 
 * 1 = IVA Responsable Inscripto
 * 4 = IVA Sujeto Exento
 * 5 = Consumidor Final
 * 6 = Responsable Monotributo
 * 7 = Sujeto No Categorizado
 * 8 = Proveedor del Exterior
 * 9 = Cliente del Exterior
 * 10 = IVA Liberado – Ley N° 19.640
 * 13 = Monotributista Social
 * 15 = IVA No Alcanzado
 * 16 = Monotributo Trabajador Independiente Promovido
 **/
$condicion_iva_receptor = 6;

/**
 * Los siguientes campos solo son obligatorios para los conceptos 2 y 3
 **/
if ($concepto === 2 || $concepto === 3) {
	/**
	 * Fecha de inicio de servicio en formato aaaammdd
	 **/
	$fecha_servicio_desde = intval(date('Ymd'));

	/**
	 * Fecha de fin de servicio en formato aaaammdd
	 **/
	$fecha_servicio_hasta = intval(date('Ymd'));

	/**
	 * Fecha de vencimiento del pago en formato aaaammdd
	 **/
	$fecha_vencimiento_pago = intval(date('Ymd'));
}
else {
	$fecha_servicio_desde = null;
	$fecha_servicio_hasta = null;
	$fecha_vencimiento_pago = null;
}


$data = array(
	'CantReg' 	=> 1, // Cantidad de Notas de Crédito a registrar
	'PtoVta' 	=> $punto_de_venta,
	'CbteTipo' 	=> $tipo_de_nota, 
	'Concepto' 	=> $concepto,
	'DocTipo' 	=> $tipo_de_documento,
	'DocNro' 	=> $numero_de_documento,
	'CbteDesde' => $numero_de_nota,
	'CbteHasta' => $numero_de_nota,
	'CbteFch' 	=> intval(str_replace('-', '', $fecha)),
	'FchServDesde'  => $fecha_servicio_desde,
	'FchServHasta'  => $fecha_servicio_hasta,
	'FchVtoPago'    => $fecha_vencimiento_pago,
	'ImpTotal' 	=> $importe_total,
	'ImpTotConc'=> 0, // Importe neto no gravado
	'ImpNeto' 	=> $importe_total, // Importe neto
	'ImpOpEx' 	=> 0, // Importe exento al IVA
	'ImpIVA' 	=> 0, // Importe de IVA
	'ImpTrib' 	=> 0, //Importe total de tributos
	'MonId' 	=> 'PES', //Tipo de moneda usada en el comprobante ('PES' = pesos argentinos) 
	'MonCotiz' 	=> 1, // Cotización de la moneda usada (1 para pesos argentinos)  
	'CondicionIVAReceptorId' => $condicion_iva_receptor, 
	'CbtesAsoc' => array( //Factura asociada
		array(
			'Tipo' 		=> $tipo_factura_asociada,
			'PtoVta' 	=> $punto_factura_asociada,
			'Nro' 		=> $numero_factura_asociada,
		)
	)
);

/** 
 * Creamos la Nota de Débito 
 **/
$res = $afip->ElectronicBilling->CreateVoucher($data);

/**
 * Mostramos por pantalla los datos de la nueva Nota de Débito 
 **/
var_dump(array(
	'cae' => $res['CAE'], //CAE asignado a la Nota de Débito
	'vencimiento' => $res['CAEFchVto'] //Fecha de vencimiento del CAE
));
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require "date"

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 212 # 212 = Nota de Débito electrónica MiPyME C

# Número de la ultima Nota de Débito electrónica MiPyME C
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Débito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Débito
tipo_factura_asociada = 11 # 11 = Factura B

# Numero de Factura asociada a la Nota de Débito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de Nota de Débito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Débito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = Time.now.strftime("%Y%m%d").to_i

# Importe de la Nota de Débito
importe_total = 100

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 6

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 || concepto == 3
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else 
  fecha_servicio_desde = nil
  fecha_servicio_hasta = nil
  fecha_vencimiento_pago = nil
end

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_total,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_total,
  "ImpOpEx": 0,
  "ImpIVA": 0,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
puts {
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
}
```

{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime

# Numero del punto de venta
punto_de_venta = 1

# Tipo de factura
tipo_de_nota = 212 # 212 = Nota de Débito electrónica MiPyME C

# Número de la ultima Nota de Débito electrónica MiPyME C
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_nota)

# Numero del punto de venta de la Factura 
# asociada a la Nota de Débito
punto_factura_asociada = 1

# Tipo de Factura asociada a la Nota de Débito
tipo_factura_asociada = 11 # 11 = Factura B

# Numero de Factura asociada a la Nota de Débito
numero_factura_asociada = 1

# Concepto de la factura
#
# Opciones:
#
# 1 = Productos 
# 2 = Servicios 
# 3 = Productos y Servicios
concepto = 1

# Tipo de documento del comprador
#
# Opciones:
#
# 80 = CUIT 
# 86 = CUIL 
# 96 = DNI
# 99 = Consumidor Final 
tipo_de_documento = 80

# Numero de documento del comprador (0 para consumidor final)
numero_de_documento = 33693450239

# Numero de Nota de Débito
numero_de_nota = last_voucher+1

# Fecha de la Nota de Débito en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
fecha = int(datetime.today().strftime("%Y%m%d"))

# Importe de la Nota de Débito
importe_total = 100

# Condición frente al IVA del receptor
# 
# Opciones:
#
# 1 = IVA Responsable Inscripto
# 4 = IVA Sujeto Exento
# 5 = Consumidor Final
# 6 = Responsable Monotributo
# 7 = Sujeto No Categorizado
# 8 = Proveedor del Exterior
# 9 = Cliente del Exterior
# 10 = IVA Liberado – Ley N° 19.640
# 13 = Monotributista Social
# 15 = IVA No Alcanzado
# 16 = Monotributo Trabajador Independiente Promovido
condicion_iva_receptor = 6

# Los siguientes campos solo son obligatorios para los conceptos 2 y 3
if concepto == 2 or concepto == 3:
    # Fecha de inicio de servicio en formato aaaammdd
    fecha_servicio_desde = 20191213

    # Fecha de fin de servicio en formato aaaammdd
    fecha_servicio_hasta = 20191213

    # Fecha de vencimiento del pago en formato aaaammdd
    fecha_vencimiento_pago = 20191213
else:
  fecha_servicio_desde = None
  fecha_servicio_hasta = None
  fecha_vencimiento_pago = None

data = {
  "CantReg": 1, # Cantidad de Notas de Crédito a registrar
  "PtoVta": punto_de_venta,
  "CbteTipo": tipo_de_nota, 
  "Concepto": concepto,
  "DocTipo": tipo_de_documento,
  "DocNro": numero_de_documento,
  "CbteDesde": numero_de_nota,
  "CbteHasta": numero_de_nota,
  "CbteFch": fecha,
  "FchServDesde": fecha_servicio_desde,
  "FchServHasta": fecha_servicio_hasta,
  "FchVtoPago": fecha_vencimiento_pago,
  "ImpTotal": importe_total,
  "ImpTotConc": 0, # Importe neto no gravado
  "ImpNeto": importe_total,
  "ImpOpEx": 0,
  "ImpIVA": 0,
  "ImpTrib": 0, # Importe total de tributos
  "MonId": "PES", # Tipo de moneda usada ("PES" = pesos argentinos) 
  "MonCotiz": 1, # Cotización de la moneda usada (1 para pesos argentinos) 
  "CondicionIVAReceptorId" : condicion_iva_receptor, 
  "CbtesAsoc": [ # Factura asociada
    {
      "Tipo": tipo_factura_asociada,
      "PtoVta": punto_factura_asociada,
      "Nro": numero_factura_asociada,
    }
  ]
}

# Creamos la Factura 
res = afip.ElectronicBilling.createVoucher(data)

# Mostramos por pantalla los datos de la nueva Factura 
print({
  "cae": res["CAE"], # CAE asignado a la Factura
  "vencimiento": res["CAEFchVto"] # Fecha de vencimiento del CAE
})
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Numero del punto de venta
int ptoVta = 1;

// Tipo de nota (212 = Nota de Débito electrónica MiPyME C)
int tipoDeLaNota = 212;

// Número de la ultima Nota de Débito electrónica MiPyME C
int lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(ptoVta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (11 = Factura C)
int tipoFacturaAsociada = 11;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239;

// Numero de Nota de Débito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd
int fecha = int.Parse(DateTime.Now.ToString("yyyyMMdd"));

// Importe de la Nota de Débito
decimal importeTotal = 100;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 6;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
int? fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3)
{
    fechaServicioDesde  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaServicioHasta  = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
    fechaVencimientoPago = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
}

var data = new Dictionary<string, object?>
{
    { "CantReg",                1 },
    { "PtoVta",                 ptoVta },
    { "CbteTipo",               tipoDeLaNota },
    { "Concepto",               concepto },
    { "DocTipo",                tipoDeDocumento },
    { "DocNro",                 numeroDeDocumento },
    { "CbteDesde",              numeroDeLaNota },
    { "CbteHasta",              numeroDeLaNota },
    { "CbteFch",                fecha },
    { "FchServDesde",           fechaServicioDesde },
    { "FchServHasta",           fechaServicioHasta },
    { "FchVtoPago",             fechaVencimientoPago },
    { "ImpTotal",               importeTotal },
    { "ImpTotConc",             0 },
    { "ImpNeto",                importeTotal },
    { "ImpOpEx",                0 },
    { "ImpIVA",                 0 },
    { "ImpTrib",                0 },
    { "MonId",                  "PES" },
    { "MonCotiz",               1 },
    { "CondicionIVAReceptorId", condicionIvaReceptor },
    { "CbtesAsoc", new List<Dictionary<string, object?>>
        {
            new Dictionary<string, object?>
            {
                { "Tipo",   tipoFacturaAsociada },
                { "PtoVta", puntoFacturaAsociada },
                { "Nro",    numeroFacturaAsociada }
            }
        }
    }
};

// Creamos la Nota de Débito
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);

Console.WriteLine($"CAE: {res["CAE"]}");
Console.WriteLine($"Vencimiento: {res["CAEFchVto"]}");
```

{% endtab %}

{% tab title="Java" %}

```java
import java.text.SimpleDateFormat;
import java.util.*;

// Numero del punto de venta
int puntoDeVenta = 1;

// Tipo de nota (212 = Nota de Débito electrónica MiPyME C)
int tipoDeLaNota = 212;

// Número de la ultima Nota de Débito electrónica MiPyME C
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeLaNota);

// Numero del punto de venta de la Factura asociada
int puntoFacturaAsociada = 1;

// Tipo de Factura asociada (11 = Factura C)
int tipoFacturaAsociada = 11;

// Numero de Factura asociada
int numeroFacturaAsociada = 1;

// Concepto: 1 = Productos, 2 = Servicios, 3 = Productos y Servicios
int concepto = 1;

// Tipo de documento: 80 = CUIT, 86 = CUIL, 96 = DNI, 99 = Consumidor Final
int tipoDeDocumento = 80;

// Numero de documento del comprador (0 para consumidor final)
long numeroDeDocumento = 33693450239L;

// Numero de Nota de Débito
int numeroDeLaNota = lastVoucher + 1;

// Fecha en formato aaaammdd (hasta 10 dias antes y 10 dias despues)
int fecha = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));

// Importe de la Nota de Débito
double importeTotal = 100.0;

// Condición frente al IVA del receptor
int condicionIvaReceptor = 6;

// Los siguientes campos solo son obligatorios para los conceptos 2 y 3
Integer fechaServicioDesde = null, fechaServicioHasta = null, fechaVencimientoPago = null;

if (concepto == 2 || concepto == 3) {
    fechaServicioDesde  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaServicioHasta  = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    fechaVencimientoPago = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
}

Map<String, Object> facturaAsociada = new HashMap<>();
facturaAsociada.put("Tipo",   tipoFacturaAsociada);
facturaAsociada.put("PtoVta", puntoFacturaAsociada);
facturaAsociada.put("Nro",    numeroFacturaAsociada);

Map<String, Object> data = new HashMap<>();
data.put("CantReg",               1);
data.put("PtoVta",                puntoDeVenta);
data.put("CbteTipo",              tipoDeLaNota);
data.put("Concepto",              concepto);
data.put("DocTipo",               tipoDeDocumento);
data.put("DocNro",                numeroDeDocumento);
data.put("CbteDesde",             numeroDeLaNota);
data.put("CbteHasta",             numeroDeLaNota);
data.put("CbteFch",               fecha);
data.put("FchServDesde",          fechaServicioDesde);
data.put("FchServHasta",          fechaServicioHasta);
data.put("FchVtoPago",            fechaVencimientoPago);
data.put("ImpTotal",              importeTotal);
data.put("ImpTotConc",            0);
data.put("ImpNeto",               importeTotal);
data.put("ImpOpEx",               0);
data.put("ImpIVA",                0);
data.put("ImpTrib",               0);
data.put("MonId",                 "PES");
data.put("MonCotiz",              1);
data.put("CondicionIVAReceptorId", condicionIvaReceptor);
data.put("CbtesAsoc",             Arrays.asList(facturaAsociada));

// Creamos la Nota de Débito
Map<String, Object> res = afip.electronicBilling().createVoucher(data);

System.out.println("CAE:         " + res.get("CAE"));
System.out.println("Vencimiento: " + res.get("CAEFchVto"));
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FECAESolicitar",
    "wsid": "wsfe",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "FeCAEReq": {
            "FeCabReq": {
                "CantReg": 1,
                "PtoVta": 1,
                "CbteTipo": 212
            },
            "FeDetReq": {
                "FECAEDetRequest": {
                    "Concepto": 1,
                    "DocTipo": 80,
                    "DocNro": 33693450239,
                    "CbteDesde": 9,
                    "CbteHasta": 9,
                    "CbteFch": 20240314,
                    "FchServDesde": null,
                    "FchServHasta": null,
                    "FchVtoPago": null,
                    "ImpTotal": 100,
                    "ImpTotConc": 0,
                    "ImpNeto": 100,
                    "ImpOpEx": 0,
                    "ImpIVA": 0,
                    "ImpTrib": 0,
                    "MonId": "PES",
                    "MonCotiz": 1,
                    "CondicionIVAReceptorId": 6,
                    "CbtesAsoc": {
                        "CbteAsoc": [
                            {
                                "Tipo": 11,
                                "PtoVta": 1,
                                "Nro": 1
                            }
                        ]
                    }
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Padrón de constancia de inscripción

### Requisitos previos

Para poder usar esta guía, primero necesitarás:

* [Integrar Afip SDK en tu proyecto](/#integracion)

***

La especificación de este Web Service se encuentra disponible en <https://www.afip.gob.ar/ws/WSCI/manual-ws-sr-ws-constancia-inscripcion-v3.4.pdf>

<details>

<summary>Identificador <kbd>ws_sr_constancia_inscripcion</kbd></summary>

Producción <img src="/files/7UHbWlGPqjSHgdX99lon" alt="Produccion" data-size="line">

Desarrollo <img src="/files/o1TNJr684jToMld2Bl23" alt="Desarrollo" data-size="original">

</details>

### **Obtener datos del contribuyente**

Nos devolverá un objeto con los detalles o `null` en caso de no existir en el padrón.

{% tabs %}
{% tab title="Node" %}

```js
// CUIT del contribuyente
const taxId = 20111111111;

const taxpayerDetails = await afip.RegisterInscriptionProof.getTaxpayerDetails(taxId);
```

{% endtab %}

{% tab title="PHP" %}

```php
// CUIT del contribuyente
$tax_id = 20111111111;

$taxpayer_details = $afip->RegisterInscriptionProof->GetTaxpayerDetails($tax_id); 
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# CUIT del contribuyente
tax_id = 20111111111

taxpayer_details = afip.RegisterInscriptionProof.getTaxpayerDetails(tax_id)
```

{% endtab %}

{% tab title="Python" %}

```python
# CUIT del contribuyente
tax_id = 20111111111

taxpayer_details = afip.RegisterInscriptionProof.getTaxpayerDetails(tax_id)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// CUIT del contribuyente
long taxId = 20111111111;

var taxpayerDetails = await afip.RegisterInscriptionProof.GetTaxpayerDetailsAsync(taxId);
```

{% endtab %}

{% tab title="Java" %}

```java
// CUIT del contribuyente
long taxId = 20111111111L;

Map<String, Object> taxpayerDetails = afip.registerInscriptionProof().getTaxpayerDetails(taxId);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "getPersona_v2",
    "wsid": "ws_sr_constancia_inscripcion",
    "params": {
        "token": "{{token}}",
        "sign": "{{sign}}",
        "cuitRepresentada": "20409378472",
        "idPersona" : 20111111111
    }
}
```

{% endtab %}
{% endtabs %}

### **Obtener datos de múltiples contribuyentes**

{% tabs %}
{% tab title="Node" %}

```js
// CUITs de los contribuyentes
const taxIds = [20111111111, 20111111112];

const taxpayersDetails = await afip.RegisterInscriptionProof.getTaxpayersDetails(taxIds);
```

{% endtab %}

{% tab title="PHP" %}

<pre class="language-php"><code class="lang-php"><strong>// CUITs de los contribuyentes
</strong>$tax_ids = Array(20111111111, 20111111112);

$taxpayers_details = $afip->RegisterInscriptionProof->GetTaxpayersDetails($tax_ids);
</code></pre>

{% endtab %}

{% tab title="Ruby" %}

```ruby
# CUITs de los contribuyentes
tax_ids = [20111111111, 20111111112]

taxpayers_details = afip.RegisterInscriptionProof.getTaxpayersDetails(tax_ids)
```

{% endtab %}

{% tab title="Python" %}

```python
# CUITs de los contribuyentes
tax_ids = [20111111111, 20111111112]

taxpayers_details = afip.RegisterInscriptionProof.getTaxpayersDetails(tax_ids)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// CUITs de los contribuyentes
long[] taxIds = [20111111111, 20111111112];

var taxpayersDetails = await afip.RegisterInscriptionProof.GetTaxpayersDetailsAsync(taxIds);
```

{% endtab %}

{% tab title="Java" %}

```java
// CUITs de los contribuyentes
long[] taxIds = {20111111111L, 20111111112L};

List<Map<String, Object>> taxpayersDetails = afip.registerInscriptionProof().getTaxpayersDetails(taxIds);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "getPersonaList_v2",
    "wsid": "ws_sr_constancia_inscripcion",
    "params": {
        "token": "{{token}}",
        "sign": "{{sign}}",
        "cuitRepresentada": "20409378472",
        "idPersona" : [
            20111111111,
            20111111112
        ]
    }
}
```

{% endtab %}
{% endtabs %}

### **Obtener estado del servidor**

{% hint style="warning" %}
No te confíes mucho de este método, ARCA siempre devuelve que esta todo bien incluso cuando hay algo fallando.
{% endhint %}

{% tabs %}
{% tab title="Node" %}

```js
const serverStatus = await afip.RegisterInscriptionProof.getServerStatus();

console.log('Este es el estado del servidor:');
console.log(serverStatus);
```

{% endtab %}

{% tab title="PHP" %}

```php
$server_status = $afip->RegisterInscriptionProof->GetServerStatus();

echo 'Este es el estado del servidor:';
echo '<pre>';
print_r($server_status);
echo '</pre>';
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
server_status = afip.RegisterInscriptionProof.getServerStatus

puts "Este es el estado del servidor:"
puts server_status
```

{% endtab %}

{% tab title="Python" %}

```python
server_status = afip.RegisterInscriptionProof.getServerStatus()

print("Este es el estado del servidor:")
print(server_status)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var serverStatus = await afip.RegisterInscriptionProof.GetServerStatusAsync();

Console.WriteLine('Este es el estado del servidor:');
Console.WriteLine(JsonSerializer.Serialize(serverStatus));
```

{% endtab %}

{% tab title="Java" %}

```java
Map<String, Object> serverStatus = afip.registerInscriptionProof().getServerStatus();

System.out.println("Este es el estado del servidor:");
System.out.println(serverStatus);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "dummy",
    "wsid": "ws_sr_constancia_inscripcion",
    "params": {}
}
```

{% endtab %}
{% endtabs %}


# Padrón alcance 10

### Requisitos previos

Para poder usar esta guía, primero necesitarás:

* [Integrar Afip SDK en tu proyecto](/#integracion)

***

La especificación de este Web Service se encuentra disponible en <https://www.afip.gob.ar/ws/ws_sr_padron_a10/manual_ws_sr_padron_a10_v1.1.pdf>

<details>

<summary>Identificador <kbd>ws_sr_padron_a10</kbd></summary>

Producción <img src="/files/Lq1hdhp5lXujMGVXrgqP" alt="Produccion" data-size="line">

Desarrollo <img src="/files/CahCut44LiqyFeYu8bWw" alt="Desarrollo" data-size="original">

</details>

### **Obtener datos del contribuyente**

Nos devolverá un objeto con los detalles o `null` en caso de no existir en el padrón.

{% tabs %}
{% tab title="Node" %}

```js
// CUIT del contribuyente
const taxId = 20111111111;

const taxpayerDetails = await afip.RegisterScopeTen.getTaxpayerDetails(taxId);
```

{% endtab %}

{% tab title="PHP" %}

```php
// CUIT del contribuyente
$tax_id = 20111111111;

$taxpayer_details = $afip->RegisterScopeTen->GetTaxpayerDetails($tax_id); 
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# CUIT del contribuyente
tax_id = 20111111111

taxpayer_details = afip.RegisterScopeTen.getTaxpayerDetails(tax_id)
```

{% endtab %}

{% tab title="Python" %}

```python
# CUIT del contribuyente
tax_id = 20111111111

taxpayer_details = afip.RegisterScopeTen.getTaxpayerDetails(tax_id)
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "getPersona",
    "wsid": "ws_sr_padron_a10",
    "params": {
        "token": "{{token}}",
        "sign": "{{sign}}",
        "cuitRepresentada": "20409378472",
        "idPersona" : 20111111111
    }
}
```

{% endtab %}
{% endtabs %}

### **Obtener estado del servidor**

{% hint style="warning" %}
No te confíes mucho de este método, ARCA siempre devuelve que esta todo bien incluso cuando hay algo fallando.
{% endhint %}

{% tabs %}
{% tab title="Node" %}

```js
const serverStatus = await afip.RegisterScopeTen.getServerStatus();

console.log('Este es el estado del servidor:');
console.log(serverStatus);
```

{% endtab %}

{% tab title="PHP" %}

```php
$server_status = $afip->RegisterScopeTen->GetServerStatus();

echo 'Este es el estado del servidor:';
echo '<pre>';
print_r($server_status);
echo '</pre>';
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
server_status = afip.RegisterScopeTen.getServerStatus

puts "Este es el estado del servidor:"
puts server_status
```

{% endtab %}

{% tab title="Python" %}

```python
server_status = afip.RegisterScopeTen.getServerStatus()

print("Este es el estado del servidor:")
print(server_status)
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "dummy",
    "wsid": "ws_sr_padron_a10",
    "params": {}
}
```

{% endtab %}
{% endtabs %}


# Padrón alcance 13

### Requisitos previos

Para poder usar esta guía, primero necesitarás:

* [Integrar Afip SDK en tu proyecto](/#integracion)

***

La especificación de este Web Service se encuentra disponible en <https://www.afip.gob.ar/ws/ws-padron-a13/manual-ws-sr-padron-a13-v1.2.pdf>

<details>

<summary>Identificador <kbd>ws_sr_padron_a13</kbd></summary>

Producción <img src="/files/iohwi1qUyKiK8yUDvvwl" alt="Produccion" data-size="line">

Desarrollo <img src="/files/6YHgXT19BNK85qgwfTR8" alt="Desarrollo" data-size="original">

</details>

#### Métodos disponibles

1. [Obtener datos del contribuyente](#obtener-datos-del-contribuyente)
2. [Obtener CUIT a partir de un DNI](#obtener-cuit-a-partir-de-un-dni)
3. [Obtener estado del servidor](#obtener-estado-del-servidor)

### **Obtener datos del contribuyente**

Nos devolverá un objeto con los detalles o `null` en caso de no existir en el padrón.

{% tabs %}
{% tab title="Node" %}

```js
// CUIT del contribuyente
const taxId = 20111111111;

const taxpayerDetails = await afip.RegisterScopeThirteen.getTaxpayerDetails(taxId);
```

{% endtab %}

{% tab title="PHP" %}

```php
// CUIT del contribuyente
$tax_id = 20111111111;

$taxpayer_details = $afip->RegisterScopeThirteen->GetTaxpayerDetails($tax_id); 
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# CUIT del contribuyente
tax_id = 20111111111

taxpayer_details = afip.RegisterScopeThirteen.getTaxpayerDetails(tax_id)
```

{% endtab %}

{% tab title="Python" %}

```python
# CUIT del contribuyente
tax_id = 20111111111

taxpayer_details = afip.RegisterScopeThirteen.getTaxpayerDetails(tax_id)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// CUIT del contribuyente
long taxId = 20111111111;

var taxpayerDetails = await afip.RegisterScopeThirteen.GetTaxpayerDetailsAsync(taxId);
```

{% endtab %}

{% tab title="Java" %}

```java
// CUIT del contribuyente
long taxId = 20111111111L;

Map<String, Object> taxpayerDetails = afip.registerScopeThirteen().getTaxpayerDetails(taxId);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "getPersona",
    "wsid": "ws_sr_padron_a13",
    "params": {
        "token": "{{token}}",
        "sign": "{{sign}}",
        "cuitRepresentada": "20409378472",
        "idPersona" : 20111111111
    }
}
```

{% endtab %}
{% endtabs %}

### **Obtener CUIT a partir de un DNI**

Nos devolverá el CUIT o `null` en caso de no existir en el padrón

{% tabs %}
{% tab title="Node" %}

```js
// DNI
const nationalId = 11111111;

const taxID = await afip.RegisterScopeThirteen.getTaxIDByDocument(nationalId);
```

{% endtab %}

{% tab title="PHP" %}

```php
// DNI
$national_id = 11111111;

$tax_id = $afip->RegisterScopeThirteen->GetTaxIDByDocument($national_id);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# DNI
national_id = 11111111

tax_id = afip.RegisterScopeThirteen.getTaxIDByDocument(national_id)
```

{% endtab %}

{% tab title="Python" %}

```python
# DNI
national_id = 11111111

tax_id = afip.RegisterScopeThirteen.getTaxIDByDocument(national_id)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// DNI
long nationalId = 11111111;

var taxID = await afip.RegisterScopeThirteen.GetTaxIDByDocumentAsync(nationalId);
```

{% endtab %}

{% tab title="Java" %}

```java
// DNI
long nationalId = 11111111L;

Object taxID = afip.registerScopeThirteen().getTaxIDByDocument(nationalId);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "getIdPersonaListByDocumento",
    "wsid": "ws_sr_padron_a13",
    "params": {
        "token": "{{token}}",
        "sign": "{{sign}}",
        "cuitRepresentada": "20409378472",
        "documento" : 11111111
    }
}
```

{% endtab %}
{% endtabs %}

### **Obtener estado del servidor**

{% hint style="warning" %}
No te confíes mucho de este método, ARCA siempre devuelve que esta todo bien incluso cuando hay algo fallando.
{% endhint %}

{% tabs %}
{% tab title="Node" %}

```js
const serverStatus = await afip.RegisterScopeThirteen.getServerStatus();

console.log('Este es el estado del servidor:');
console.log(serverStatus);
```

{% endtab %}

{% tab title="PHP" %}

```php
$server_status = $afip->RegisterScopeThirteen->GetServerStatus();

echo 'Este es el estado del servidor:';
echo '<pre>';
print_r($server_status);
echo '</pre>';
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
server_status = afip.RegisterScopeThirteen.getServerStatus

puts "Este es el estado del servidor:"
puts server_status
```

{% endtab %}

{% tab title="Python" %}

```python
server_status = afip.RegisterScopeThirteen.getServerStatus

print("Este es el estado del servidor:")
print(server_status)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var serverStatus = await afip.RegisterScopeThirteen.GetServerStatusAsync();

Console.WriteLine('Este es el estado del servidor:');
Console.WriteLine(JsonSerializer.Serialize(serverStatus));
```

{% endtab %}

{% tab title="Java" %}

```java
Map<String, Object> serverStatus = afip.registerScopeThirteen().getServerStatus();

System.out.println("Este es el estado del servidor:");
System.out.println(serverStatus);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "dummy",
    "wsid": "ws_sr_padron_a13",
    "params": {}
}
```

{% endtab %}
{% endtabs %}


# Factura MiPyME

### Requisitos previos

Para poder usar esta guía, primero necesitarás:

* [Integrar Afip SDK en tu proyecto](/#integracion)

***

<https://servicioscf.afip.gob.ar/facturadecreditoelectronica/documentos/Manual-Desarrollador-WSFECRED.pdf>

<details>

<summary>Identificador <kbd>wsfecred</kbd></summary>

Producción <img src="/files/QGwOSkPC4zR0p25CSAil" alt="Produccion" data-size="line">

Desarrollo <img src="/files/lb3HDMp0GlHRr3vRpKIW" alt="Desarrollo" data-size="original">

</details>

### **Paso 1 - Crear una instancia del web service**

{% tabs %}
{% tab title="Node" %}

```js
const ws = afip.WebService('wsfecred');
```

{% endtab %}

{% tab title="PHP" %}

```php
$ws = $afip->WebService('wsfecred');
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
ws = afip.webService("wsfecred")
```

{% endtab %}

{% tab title="Python" %}

```python
ws = afip.webService("wsfecred")
```

{% endtab %}

{% tab title=".NET" %}

```csharp
AfipWebService ws = afip.WebService("wsfecred");
```

{% endtab %}

{% tab title="Java" %}

```java
AfipWebService ws = afip.webService("wsfecred");
```

{% endtab %}

{% tab title="API" %}
No se requiere ninguna acción adicional.
{% endtab %}
{% endtabs %}

### **Paso 2 - Preparar lo datos para la solicitud**

En la [Referencia de API de Factura MiPyME](https://afipsdk.com/docs/api-reference/web-services/wsfecred/) pueden encontrar los métodos disponibles.

En este ejemplo vamos a usar los datos para el método `consultarMontoObligadoRecepcion`

{% tabs %}
{% tab title="Node" %}

```js
// Obtenemos el TA
const ta = await ws.getTokenAuthorization();
	
// Preparamos los datos
const data = {
    'authRequest': {
        'token': ta.token,
        'sign': ta.sign,
        'cuitRepresentada': afip.CUIT,
    },
    'cuitConsultada': '20409378472',
    'fechaEmision': '2024-03-03'
};
```

{% endtab %}

{% tab title="PHP" %}

```php
// Obtenemos el TA
$ta = $ws->GetTokenAuthorization();
	
// Preparamos los datos
$data = array(
	'authRequest' => array(
        'token' => $ta->token,
        'sign' => $ta->sign,
        'cuitRepresentada' => $afip->CUIT,
    ),
    'cuitConsultada' => '20409378472',
    'fechaEmision' => '2024-03-03'
);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# Obtenemos el TA
ta = ws.getTokenAuthorization

# Preparamos los datos
data = {
  "authRequest": {
    "token": ta["token"],
    "sign": ta["sign"],
    "cuitRepresentada": afip.CUIT
  },
  "cuitConsultada": "20409378472",
  "fechaEmision": "2024-03-03"
}
```

{% endtab %}

{% tab title="Python" %}

```python
# Obtenemos el TA
ta = ws.getTokenAuthorization()

# Preparamos los datos
data = {
  "authRequest": {
    "token": ta["token"],
    "sign": ta["sign"],
    "cuitRepresentada": afip.CUIT
  },
  "cuitConsultada": "20409378472",
  "fechaEmision": "2024-03-03"
}
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Obtenemos el TA
var ta = await ws.GetTokenAuthorizationAsync();

// Preparamos los datos
var data = new Dictionary<string, object?>
{
    ["authRequest"] = new Dictionary<string, object?>
    {
        ["token"] = ta["token"],
        ["sign"] = ta["sign"],
        ["cuitRepresentada"] = afip.CUIT,
    },
    ["cuitConsultada"] = "20409378472",
    ["fechaEmision"] = "2024-03-03"
};
```

{% endtab %}

{% tab title="Java" %}

```java
// Obtenemos el TA
GetServiceTAResponse ta = ws.getTokenAuthorization();

// Preparamos los datos
Map<String, Object> authRequest = new HashMap<>();
authRequest.put("token", ta.getToken());
authRequest.put("sign", ta.getSign());
authRequest.put("cuitRepresentada", afip.getOptions().getCuit());

Map<String, Object> data = new HashMap<>();
data.put("authRequest", authRequest);
data.put("cuitConsultada", "20409378472");
data.put("fechaEmision", "2024-03-03");
```

{% endtab %}

{% tab title="API" %}
No se requiere ninguna acción adicional.
{% endtab %}
{% endtabs %}

### **Paso 3 - Ejecutamos la solicitud**

{% tabs %}
{% tab title="Node" %}

```js
const res = await ws.executeRequest('consultarMontoObligadoRecepcion', data);

console.log(res);
```

{% endtab %}

{% tab title="PHP" %}

```php
$res = $ws->ExecuteRequest('consultarMontoObligadoRecepcion', $data);

var_dump($res);
```

{% endtab %}

{% tab title="Ruby" %}

```
res = ws.executeRequest("consultarMontoObligadoRecepcion", data)

puts res
```

{% endtab %}

{% tab title="Python" %}

```python
res = ws.executeRequest("consultarMontoObligadoRecepcion", data)

print(res)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var res = await ws.ExecuteRequestAsync<Dictionary<string, object?>>("consultarMontoObligadoRecepcion", data);

Console.WriteLine(JsonSerializer.Serialize(res));
```

{% endtab %}

{% tab title="Java" %}

```java
Map<String, Object> res = ws.executeRequest("consultarMontoObligadoRecepcion", data);

System.out.println(res);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "consultarMontoObligadoRecepcion",
    "wsid": "wsfecred",
    "params": {
        "authRequest": {
            "token": "{{token}}",
            "sign": "{{sign}}",
            "cuitRepresentada": "20409378472",
        },
        "cuitConsultada": "20409378472",
        "fechaEmision": "2024-03-03"
    }
}
```

{% endtab %}
{% endtabs %}


# Constatación de Comprobantes

### Requisitos previos

Para poder usar esta guía, primero necesitarás:

* [Integrar Afip SDK en tu proyecto](/#integracion)

***

<https://www.afip.gob.ar/ws/WSCDCV1/WSCDC_manual_desarrollador_v.2.pdf>

<details>

<summary>Identificador <kbd>wscdc</kbd></summary>

Producción <img src="/files/2MfR8eglU7oXMmZAqg6h" alt="Produccion" data-size="line">

Desarrollo <img src="/files/ycJkoLkZmdfaZt1HSWJo" alt="Desarrollo" data-size="original">

</details>

### **Paso 1 - Crear una instancia del web service**

{% tabs %}
{% tab title="Node" %}

```js
const ws = afip.WebService('wscdc');
```

{% endtab %}

{% tab title="PHP" %}

```php
$ws = $afip->WebService('wscdc');
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
ws = afip.webService("wscdc")
```

{% endtab %}

{% tab title="Python" %}

```python
ws = afip.webService("wscdc")
```

{% endtab %}

{% tab title=".NET" %}

```csharp
AfipWebService ws = afip.WebService("wscdc");
```

{% endtab %}

{% tab title="Java" %}

```java
AfipWebService ws = afip.webService("wscdc");
```

{% endtab %}

{% tab title="API" %}
No se requiere ninguna acción adicional.
{% endtab %}
{% endtabs %}

### **Paso 2 - Preparar los datos para la solicitud**

En la [Referencia de API de Constatación de Comprobantes](https://afipsdk.com/docs/api-reference/web-services/wscdc/) pueden encontrar los métodos disponibles.

En este ejemplo vamos a usar los datos para el método `ComprobanteConstatar`

{% tabs %}
{% tab title="Node" %}

```js
// Obtenemos el TA
const ta = await ws.getTokenAuthorization();
	
// Preparamos los datos
const data = {
	'Auth': { 
		'Token': ta.token,
		'Sign': ta.sign,
		'Cuit': afip.CUIT
	},
	'CmpReq': {
                'CbteModo': 'CAE',
                'CuitEmisor': 20000000001,
                'PtoVta': 1,
                'CbteTipo': 1,
                'CbteNro': 2,
                'CbteFch': 20101014,
                'ImpTotal': 300.8,
                'CodAutorizacion': '60428000005029',
                'DocTipoReceptor': '80',
                'DocNroReceptor': '300000000007'
        }
};
```

{% endtab %}

{% tab title="PHP" %}

```php
// Obtenemos el TA
$ta = $ws->GetTokenAuthorization();
	
// Preparamos los datos
$data = array(
	'Auth' => array( 
		'Token' => $ta->token,
		'Sign' => $ta->sign,
		'Cuit' => $afip->CUIT
	),
	'CmpReq' => array(
                'CbteModo' => 'CAE',
                'CuitEmisor' => 20000000001,
                'PtoVta' => 1,
                'CbteTipo' => 1,
                'CbteNro' => 2,
                'CbteFch' => 20101014,
                'ImpTotal' => 300.8,
                'CodAutorizacion' => '60428000005029',
                'DocTipoReceptor' => '80',
                'DocNroReceptor' => '300000000007'
        )
);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# Obtenemos el TA
ta = ws.getTokenAuthorization
	
# Preparamos los datos
data = {
  "Auth": { 
    "Token": ta["token"],
    "Sign": ta["sign"],
    "Cuit": afip.CUIT
  },
  "CmpReq": {
    "CbteModo": "CAE",
    "CuitEmisor": 20000000001,
    "PtoVta": 1,
    "CbteTipo": 1,
    "CbteNro": 2,
    "CbteFch": 20101014,
    "ImpTotal": 300.8,
    "CodAutorizacion": "60428000005029",
    "DocTipoReceptor": "80",
    "DocNroReceptor": "300000000007"
  }
}
```

{% endtab %}

{% tab title="Python" %}

```python
# Obtenemos el TA
ta = ws.getTokenAuthorization()
	
# Preparamos los datos
data = {
  "Auth": { 
    "Token": ta["token"],
    "Sign": ta["sign"],
    "Cuit": afip.CUIT
  },
  "CmpReq": {
    "CbteModo": "CAE",
    "CuitEmisor": 20000000001,
    "PtoVta": 1,
    "CbteTipo": 1,
    "CbteNro": 2,
    "CbteFch": 20101014,
    "ImpTotal": 300.8,
    "CodAutorizacion": "60428000005029",
    "DocTipoReceptor": "80",
    "DocNroReceptor": "300000000007"
  }
}
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Obtenemos el TA
var ta = await ws.GetTokenAuthorizationAsync();

// Preparamos los datos
var data = new Dictionary<string, object?>
{
    ["Auth"] = new Dictionary<string, object?>
    {
        ["Token"] = ta["token"],
        ["Sign"] = ta["sign"],
        ["Cuit"] = afip.CUIT
    },
    ["CmpReq"] = new Dictionary<string, object?>
    {
        ["CbteModo"] = "CAE",
        ["CuitEmisor"] = 20000000001,
        ["PtoVta"] = 1,
        ["CbteTipo"] = 1,
        ["CbteNro"] = 2,
        ["CbteFch"] = 20101014,
        ["ImpTotal"] = 300.8,
        ["CodAutorizacion"] = "60428000005029",
        ["DocTipoReceptor"] = "80",
        ["DocNroReceptor"] = "300000000007"
    }
};
```

{% endtab %}

{% tab title="Java" %}

```java
// Obtenemos el TA
GetServiceTAResponse ta = ws.getTokenAuthorization();

// Preparamos los datos
Map<String, Object> auth = new HashMap<>();
auth.put("Token", ta.getToken());
auth.put("Sign", ta.getSign());
auth.put("Cuit", afip.getOptions().getCuit());

Map<String, Object> cmpReq = new HashMap<>();
cmpReq.put("CbteModo", "CAE");
cmpReq.put("CuitEmisor", 20000000001L);
cmpReq.put("PtoVta", 1);
cmpReq.put("CbteTipo", 1);
cmpReq.put("CbteNro", 2);
cmpReq.put("CbteFch", 20101014);
cmpReq.put("ImpTotal", 300.8);
cmpReq.put("CodAutorizacion", "60428000005029");
cmpReq.put("DocTipoReceptor", "80");
cmpReq.put("DocNroReceptor", "300000000007");

Map<String, Object> data = new HashMap<>();
data.put("Auth", auth);
data.put("CmpReq", cmpReq);
```

{% endtab %}

{% tab title="API" %}
No se requiere ninguna acción adicional.
{% endtab %}
{% endtabs %}

### **Paso 3 - Ejecutamos la solicitud**

{% tabs %}
{% tab title="Node" %}

```js
const res = await ws.executeRequest('ComprobanteConstatar', data);

console.log(res);
```

{% endtab %}

{% tab title="PHP" %}

```php
$res = $ws->ExecuteRequest('ComprobanteConstatar', $data);

var_dump($res);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
res = ws.executeRequest("ComprobanteConstatar", data)

puts res
```

{% endtab %}

{% tab title="Python" %}

```python
res = ws.executeRequest("ComprobanteConstatar", data)

print(res)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var res = await ws.ExecuteRequestAsync<Dictionary<string, object?>>("ComprobanteConstatar", data);

Console.WriteLine(JsonSerializer.Serialize(res));
```

{% endtab %}

{% tab title="Java" %}

```java
Map<String, Object> res = ws.executeRequest("ComprobanteConstatar", data);

System.out.println(res);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "ComprobanteConstatar",
    "wsid": "wscdc",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472"
        },
        "CmpReq": {
            "CbteModo": "CAE",
            "CuitEmisor": 20000000001,
            "PtoVta": 1,
            "CbteTipo": 1,
            "CbteNro": 2,
            "CbteFch": 20101014,
            "ImpTotal": 300.8,
            "CodAutorizacion": "60428000005029",
            "DocTipoReceptor": "80",
            "DocNroReceptor": "300000000007"
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Carta de Porte Electrónica

### Requisitos previos

Para poder usar esta guía, primero necesitarás:

* [Integrar Afip SDK en tu proyecto](/#integracion)

***

<https://www.afip.gob.ar/ws/documentos/manual_wscpe_version-2-0-3.pdf>

<details>

<summary>Identificador <kbd>wscpe</kbd></summary>

Producción <img src="/files/43hahnuGWTKVgLg13RRq" alt="Produccion" data-size="line">

Desarrollo <img src="/files/uvk4aCziYkKMPDX5Ku1M" alt="Desarrollo" data-size="original">

</details>

### **Paso 1 - Crear una instancia del web service**

{% tabs %}
{% tab title="Node" %}

```js
const ws = afip.WebService('wscpe');
```

{% endtab %}

{% tab title="PHP" %}

```php
$ws = $afip->WebService('wscpe');
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
ws = afip.webService("wscpe")
```

{% endtab %}

{% tab title="Python" %}

```python
ws = afip.webService("wscpe")
```

{% endtab %}

{% tab title=".NET" %}

```csharp
AfipWebService ws = afip.WebService("wscpe");
```

{% endtab %}

{% tab title="Java" %}

```java
AfipWebService ws = afip.webService("wscpe");
```

{% endtab %}

{% tab title="API" %}
No se requiere ninguna acción adicional.
{% endtab %}
{% endtabs %}

### **Paso 2 - Preparar los datos para la solicitud**

En la [Referencia de API de Carta de Porte Electrónica](https://afipsdk.com/docs/api-reference/web-services/wscpe/) pueden encontrar los métodos disponibles.

En este ejemplo vamos a usar los datos para el método `consultarUltNroOrden`

{% tabs %}
{% tab title="Node" %}

```js
// Obtenemos el TA
const ta = await ws.getTokenAuthorization();
	
// Preparamos los datos
const data = {
	'auth': { 
		'token': ta.token,
		'sign': ta.sign,
		'cuitRepresentada': afip.CUIT
	},
	'solicitud': {
		'sucursal': 195,
		'tipoCPE': 1
	}
};
```

{% endtab %}

{% tab title="PHP" %}

```php
// Obtenemos el TA
$ta = $ws->GetTokenAuthorization();
	
// Preparamos los datos
$data = array(
	'auth' => array( 
		'token' => $ta->token,
		'sign' => $ta->sign,
		'cuitRepresentada' => $afip->CUIT
	),
	'solicitud' => array(
		'sucursal' => 195,
		'tipoCPE' => 1
	)
);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# Obtenemos el TA
ta = ws.getTokenAuthorization

# Preparamos los datos
data = {
  "auth": { 
    "token": ta["token"],
    "sign": ta["sign"],
    "cuitRepresentada": afip.CUIT
  },
  "solicitud": {
    "sucursal": 195,
    "tipoCPE": 1
  }
}
```

{% endtab %}

{% tab title="Python" %}

```python
# Obtenemos el TA
ta = ws.getTokenAuthorization()

# Preparamos los datos
data = {
  "auth": { 
    "token": ta["token"],
    "sign": ta["sign"],
    "cuitRepresentada": afip.CUIT
  },
  "solicitud": {
    "sucursal": 195,
    "tipoCPE": 1
  }
}
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Obtenemos el TA
var ta = await ws.GetTokenAuthorizationAsync();

// Preparamos los datos
var data = new Dictionary<string, object?>
{
    ["auth"] = new Dictionary<string, object?>
    {
        ["token"] = ta["token"],
        ["sign"] = ta["sign"],
        ["cuitRepresentada"] = afip.CUIT
    },
    ["solicitud"] = new Dictionary<string, object?>
    {
        ["sucursal"] = 195,
        ["tipoCPE"] = 1
    }
};
```

{% endtab %}

{% tab title="Java" %}

```java
// Obtenemos el TA
GetServiceTAResponse ta = ws.getTokenAuthorization();

// Preparamos los datos
Map<String, Object> auth = new HashMap<>();
auth.put("token", ta.getToken());
auth.put("sign", ta.getSign());
auth.put("cuitRepresentada", afip.getOptions().getCuit());

Map<String, Object> solicitud = new HashMap<>();
solicitud.put("sucursal", 195);
solicitud.put("tipoCPE", 1);

Map<String, Object> data = new HashMap<>();
data.put("auth", auth);
data.put("solicitud", solicitud);
```

{% endtab %}

{% tab title="API" %}
No se requiere ninguna acción adicional.
{% endtab %}
{% endtabs %}

### **Paso 3 - Ejecutamos la solicitud**

{% tabs %}
{% tab title="Node" %}

```js
const res = await ws.executeRequest('consultarUltNroOrden', data);

console.log(res);
```

{% endtab %}

{% tab title="PHP" %}

```php
$res = $ws->ExecuteRequest('consultarUltNroOrden', $data);

var_dump($res);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
res = ws.executeRequest("consultarUltNroOrden", data)

puts res
```

{% endtab %}

{% tab title="Python" %}

```python
res = ws.executeRequest("consultarUltNroOrden", data)

print(res)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var res = await ws.ExecuteRequestAsync<Dictionary<string, object?>>("consultarUltNroOrden", data);

Console.WriteLine(JsonSerializer.Serialize(res));
```

{% endtab %}

{% tab title="Java" %}

```java
Map<String, Object> res = ws.executeRequest("consultarUltNroOrden", data);

System.out.println(res);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "consultarUltNroOrden",
    "wsid": "wscpe",
    "params": {
            "auth": { 
                    "token": "{{token}}",
                    "sign": "{{sign}}",
                    "cuitRepresentada": "20409378472"
            },
            "solicitud": {
                    "sucursal": 195,
                    "tipoCPE": 1
            }
    }
}
```

{% endtab %}
{% endtabs %}


# Comprobantes de Turismo

### Requisitos previos

Para poder usar esta guía, primero necesitarás:

* [Integrar Afip SDK en tu proyecto](/#integracion)

***

<https://www.afip.gob.ar/fe/documentos/Manual-Desarrollador-WSCT.pdf>

<details>

<summary>Identificador <kbd>wsct</kbd></summary>

Producción <img src="/files/96iSq71BvGftINgBc01T" alt="Produccion" data-size="line">

Desarrollo <img src="/files/b5sXpnPNk6BFb0LY1xbR" alt="Desarrollo" data-size="original">

</details>

### **Paso 1 - Crear una instancia del web service**

{% tabs %}
{% tab title="Node" %}

```js
const ws = afip.WebService('wsct');
```

{% endtab %}

{% tab title="PHP" %}

```php
$ws = $afip->WebService('wsct');
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
ws = afip.webService("wsct")
```

{% endtab %}

{% tab title="Python" %}

```python
ws = afip.webService("wsct")
```

{% endtab %}

{% tab title=".NET" %}

```csharp
AfipWebService ws = afip.WebService("wsct");
```

{% endtab %}

{% tab title="Java" %}

```java
AfipWebService ws = afip.webService("wsct");
```

{% endtab %}

{% tab title="API" %}
No se requiere ninguna acción adicional.
{% endtab %}
{% endtabs %}

### **Paso 2 - Preparar los datos para la solicitud**

En la [Referencia de API de Comprobantes de Turismo](https://afipsdk.com/docs/api-reference/web-services/wsct/) pueden encontrar los métodos disponibles.

En este ejemplo vamos a usar los datos para el método `consultarUltimoComprobanteAutorizado`

{% tabs %}
{% tab title="Node" %}

```js
// Obtenemos el TA
const ta = await ws.getTokenAuthorization();
	
// Preparamos los datos
const data = {
	'authRequest': { 
		'token': ta.token,
		'sign': ta.sign,
		'cuitRepresentada': afip.CUIT
	},
	'codigoTipoComprobante': 195,
	'numeroPuntoVenta': 1
};
```

{% endtab %}

{% tab title="PHP" %}

```php
// Obtenemos el TA
$ta = $ws->GetTokenAuthorization();
	
// Preparamos los datos
$data = array(
	'authRequest' => array( 
		'token' => $ta->token,
		'sign' => $ta->sign,
		'cuitRepresentada' => $afip->CUIT
	),
	'codigoTipoComprobante' => 195,
	'numeroPuntoVenta' => 1
);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# Obtenemos el TA
ta = ws.getTokenAuthorization

# Preparamos los datos
data = {
  "authRequest": {
    "token": ta["token"],
    "sign": ta["sign"],
    "cuitRepresentada": afip.CUIT
  },
  "codigoTipoComprobante": 195,
  "numeroPuntoVenta": 1
}
```

{% endtab %}

{% tab title="Python" %}

```python
# Obtenemos el TA
ta = ws.getTokenAuthorization()

# Preparamos los datos
data = {
  "authRequest": {
    "token": ta["token"],
    "sign": ta["sign"],
    "cuitRepresentada": afip.CUIT
  },
  "codigoTipoComprobante": 195,
  "numeroPuntoVenta": 1
}
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Obtenemos el TA
var ta = await ws.GetTokenAuthorizationAsync();

// Preparamos los datos
var data = new Dictionary<string, object?>
{
    ["authRequest"] = new Dictionary<string, object?>
    {
        ["token"] = ta["token"],
        ["sign"] = ta["sign"],
        ["cuitRepresentada"] = afip.CUIT
    },
    ["codigoTipoComprobante"] = 195,
    ["numeroPuntoVenta"] = 1
};
```

{% endtab %}

{% tab title="Java" %}

```java
// Obtenemos el TA
GetServiceTAResponse ta = ws.getTokenAuthorization();

// Preparamos los datos
Map<String, Object> authRequest = new HashMap<>();
authRequest.put("token", ta.getToken());
authRequest.put("sign", ta.getSign());
authRequest.put("cuitRepresentada", afip.getOptions().getCuit());

Map<String, Object> data = new HashMap<>();
data.put("authRequest", authRequest);
data.put("codigoTipoComprobante", 195);
data.put("numeroPuntoVenta", 1);
```

{% endtab %}

{% tab title="API" %}
No se requiere ninguna acción adicional.
{% endtab %}
{% endtabs %}

### **Paso 3 - Ejecutamos la solicitud**

{% tabs %}
{% tab title="Node" %}

```js
const res = await ws.executeRequest('consultarUltimoComprobanteAutorizado', data);

console.log(res);
```

{% endtab %}

{% tab title="PHP" %}

```php
$res = $ws->ExecuteRequest('consultarUltimoComprobanteAutorizado', $data);

var_dump($res);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
res = ws.executeRequest("consultarUltimoComprobanteAutorizado", data)

puts res
```

{% endtab %}

{% tab title="Python" %}

```python
res = ws.executeRequest("consultarUltimoComprobanteAutorizado", data)

print(res)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var res = await ws.ExecuteRequestAsync<Dictionary<string, object?>>("consultarUltimoComprobanteAutorizado", data);

Console.WriteLine(JsonSerializer.Serialize(res));
```

{% endtab %}

{% tab title="Java" %}

```java
Map<String, Object> res = ws.executeRequest("consultarUltimoComprobanteAutorizado", data);

System.out.println(res);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "consultarUltimoComprobanteAutorizado",
    "wsid": "wsct",
    "params": {
        "authRequest": {
            "token": "{{token}}",
            "sign": "{{sign}}",
            "cuitRepresentada": "20409378472"
        },
        "codigoTipoComprobante": 195,
        "numeroPuntoVenta": 1
    }
}
```

{% endtab %}
{% endtabs %}


# Factura de Exportación

### Requisitos previos

Para poder usar esta guía, primero necesitarás:

* [Integrar Afip SDK en tu proyecto](/#integracion)

***

<https://www.afip.gob.ar/fe/documentos/WSFEX-Manual-para-el-desarrollador.pdf>

<details>

<summary>Identificador <kbd>wsfex</kbd></summary>

Producción <img src="/files/xpxXzFo0Vrkd0iVb5ARL" alt="Produccion" data-size="line">

Desarrollo <img src="/files/yVh0fMdPq5rFYfpxUKgE" alt="Desarrollo" data-size="original">

</details>

### **Paso 1 - Crear una instancia del web service**

{% tabs %}
{% tab title="Node" %}

```js
const ws = afip.WebService('wsfex');
```

{% endtab %}

{% tab title="PHP" %}

```php
$ws = $afip->WebService('wsfex');
```

{% endtab %}

{% tab title="Ruby" %}

<pre class="language-ruby"><code class="lang-ruby"><strong>ws = afip.webService("wsfex")
</strong></code></pre>

{% endtab %}

{% tab title="Python" %}

<pre class="language-python"><code class="lang-python"><strong>ws = afip.webService("wsfex")
</strong></code></pre>

{% endtab %}

{% tab title=".NET" %}

```csharp
AfipWebService ws = afip.WebService("wsfex");
```

{% endtab %}

{% tab title="Java" %}

```java
AfipWebService ws = afip.webService("wsfex");
```

{% endtab %}

{% tab title="API" %}
No se requiere ninguna acción adicional.
{% endtab %}
{% endtabs %}

### **Paso 2 - Preparar lo datos para la solicitud**

En la [Referencia de API de Factura de Exportación](https://afipsdk.com/docs/api-reference/web-services/wsfex/) pueden encontrar los métodos disponibles

En este ejemplo vamos a usar los datos para el método FEXGetLast\_ID

{% tabs %}
{% tab title="Node" %}

```js
// Obtenemos el TA
const ta = await ws.getTokenAuthorization();
	
// Preparamos los datos
const data = {
	'Auth': { 
		'Token': ta.token,
		'Sign': ta.sign,
		'Cuit': afip.CUIT
	}
};
```

{% endtab %}

{% tab title="PHP" %}

```php
// Obtenemos el TA
$ta = $ws->GetTokenAuthorization();
	
// Preparamos los datos
$data = array(
	'Auth' => array( 
		'Token' => $ta->token,
		'Sign' => $ta->sign,
		'Cuit' => $afip->CUIT
	)
);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# Obtenemos el TA
ta = ws.getTokenAuthorization
	
# Preparamos los datos
data = {
  "Auth": { 
    "Token": ta["token"],
    "Sign": ta["sign"],
    "Cuit": afip.CUIT
  }
}
```

{% endtab %}

{% tab title="Python" %}

```python
# Obtenemos el TA
ta = ws.getTokenAuthorization()
	
# Preparamos los datos
data = {
  "Auth": { 
    "Token": ta["token"],
    "Sign": ta["sign"],
    "Cuit": afip.CUIT
  }
}
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Obtenemos el TA
var ta = await ws.GetTokenAuthorizationAsync();

// Preparamos los datos
var data = new Dictionary<string, object?>
{
    ["Auth"] = new Dictionary<string, object?>
    {
        ["Token"] = ta["token"],
        ["Sign"] = ta["sign"],
        ["Cuit"] = afip.CUIT
    }
};
```

{% endtab %}

{% tab title="Java" %}

```java
// Obtenemos el TA
GetServiceTAResponse ta = ws.getTokenAuthorization();

// Preparamos los datos
Map<String, Object> auth = new HashMap<>();
auth.put("Token", ta.getToken());
auth.put("Sign", ta.getSign());
auth.put("Cuit", afip.getOptions().getCuit());

Map<String, Object> data = new HashMap<>();
data.put("Auth", auth);
```

{% endtab %}

{% tab title="API" %}
No se requiere ninguna acción adicional.
{% endtab %}
{% endtabs %}

### **Paso 3 - Ejecutamos la solicitud**

{% tabs %}
{% tab title="Node" %}

```js
const res = await ws.executeRequest('FEXGetLast_ID', data);

console.log(res);
```

{% endtab %}

{% tab title="PHP" %}

```php
$res = $ws->ExecuteRequest('FEXGetLast_ID', $data);

var_dump($res);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
res = ws.executeRequest("FEXGetLast_ID", data)

puts res
```

{% endtab %}

{% tab title="Python" %}

```python
res = ws.executeRequest("FEXGetLast_ID", data)

print(res)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var res = await ws.ExecuteRequestAsync<Dictionary<string, object?>>("FEXGetLast_ID", data);

Console.WriteLine(JsonSerializer.Serialize(res));
```

{% endtab %}

{% tab title="Java" %}

```java
Map<String, Object> res = ws.executeRequest("FEXGetLast_ID", data);

System.out.println(res);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "FEXGetLast_ID",
    "wsid": "wsfex",
    "params": {
        "Auth": {
            "Token": "{{token}}",
            "Sign": "{{sign}}",
            "Cuit": "20409378472",
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Remito cárnico

### Requisitos previos

Para poder usar esta guía, primero necesitarás:

* [Integrar Afip SDK en tu proyecto](/#integracion)

***

<https://www.afip.gob.ar/ws/remitoElecCarnico/Manual_Desarrollador_WSREMCARNE_v3_6.pdf>

<details>

<summary>Identificador <kbd>wsremcarne</kbd></summary>

Producción <img src="/files/0SuBWcc6JW0kAoGyiJcC" alt="Produccion" data-size="line">

Desarrollo <img src="/files/PEhHeMAIXaQl8jmEm5I2" alt="Desarrollo" data-size="original">

</details>

### **Paso 1 - Crear una instancia del web service**

{% tabs %}
{% tab title="Node" %}

```js
const ws = afip.WebService('wsremcarne');
```

{% endtab %}

{% tab title="PHP" %}

```php
$ws = $afip->WebService('wsremcarne');
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
ws = afip.webService("wsremcarne")
```

{% endtab %}

{% tab title="Python" %}

```python
ws = afip.webService("wsremcarne")
```

{% endtab %}

{% tab title=".NET" %}

```csharp
AfipWebService ws = afip.WebService("wsremcarne");
```

{% endtab %}

{% tab title="Java" %}

```java
AfipWebService ws = afip.webService("wsremcarne");
```

{% endtab %}

{% tab title="API" %}
No se requiere ninguna acción adicional.
{% endtab %}
{% endtabs %}

### **Paso 2 - Preparar lo datos para la solicitud**

En la [Referencia de API de Remito Cárnico](https://afipsdk.com/docs/api-reference/web-services/wsremcarne/) pueden encontrar los métodos disponibles

En este ejemplo vamos a usar los datos para el método `generarRemito`

{% tabs %}
{% tab title="Node" %}

```js
// Obtenemos el TA
const ta = await ws.getTokenAuthorization();
	
// Preparamos los datos
const data = {
	'authRequest': {
            'token': ta.token,
            'sign': ta.sign,
            'cuitRepresentada': afip.CUIT,
        },
        'idReq': 410,
        'remito': {
            'tipoComprobante': 995,
            'tipoMovimiento': 'ENV',
            'categoriaEmisor': 1,
            'puntoEmision': 9000,
            'cuitTitularMercaderia': 11111111111,
            'tipoReceptor': 'MI',
            'categoriaReceptor': 3,
            'cuitReceptor': 22222222222,
            'codDomDestino': 3,
            'viaje': {
                'cuitTransportista': 33333333333,
                'cuitConductor': 44444444444,
                'fechaInicioViaje': '2019-02-14',
                'distanciaKm': 670,
                'vehiculo': {
                    'dominioVehiculo': 'ARF458'
                }
            },
            'arrayMercaderias': [
                {
                    'orden': 1,
                    'codTipoProd': 6.24,
                    'tropa': 121,
                    'kilos': 50,
                    'unidades': 4,
                },
                {
                    'orden': 2,
                    'codTipoProd': 6.9,
                    'tropa': 121,
                    'kilos': 50,
                    'unidades': 0,
                }
            ]
        }
};
```

{% endtab %}

{% tab title="PHP" %}

```php
// Obtenemos el TA
$ta = $ws->GetTokenAuthorization();
	
// Preparamos los datos
$data = array(
	'authRequest' => array(
            'token' => $ta->token,
            'sign' => $ta->sign,
            'cuitRepresentada' => $afip->CUIT,
        ),
        'idReq' => 410,
        'remito' => array(
            'tipoComprobante' => 995,
            'tipoMovimiento' => 'ENV',
            'categoriaEmisor' => 1,
            'puntoEmision' => 9000,
            'cuitTitularMercaderia' => 11111111111,
            'tipoReceptor' => 'MI',
            'categoriaReceptor' => 3,
            'cuitReceptor' => 22222222222,
            'codDomDestino' => 3,
            'viaje' => array(
                'cuitTransportista' => 33333333333,
                'cuitConductor' => 44444444444,
                'fechaInicioViaje' => '2019-02-14',
                'distanciaKm' => 670,
                'vehiculo' => array(
                    'dominioVehiculo' => 'ARF458'
                )
            ),
            'arrayMercaderias' => array(
                array(
                    'orden' => 1,
                    'codTipoProd' => 6.24,
                    'tropa' => 121,
                    'kilos' => 50,
                    'unidades' => 4,
                ),
                array(
                    'orden' => 2,
                    'codTipoProd' => 6.9,
                    'tropa' => 121,
                    'kilos' => 50,
                    'unidades' => 0,
                )
            )
        )
);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# Obtenemos el TA
ta = ws.getTokenAuthorization

# Preparamos los datos
data = {
  "authRequest": {
    "token": ta["token"],
    "sign": ta["sign"],
    "cuitRepresentada": afip.CUIT
  },
  "idReq": 410,
  "remito": {
    "tipoComprobante": 995,
    "tipoMovimiento": "ENV",
    "categoriaEmisor": 1,
    "puntoEmision": 9000,
    "cuitTitularMercaderia": 11111111111,
    "tipoReceptor": "MI",
    "categoriaReceptor": 3,
    "cuitReceptor": 22222222222,
    "codDomDestino": 3,
    "viaje": {
      "cuitTransportista": 33333333333,
      "cuitConductor": 44444444444,
      "fechaInicioViaje": "2019-02-14",
      "distanciaKm": 670,
      "vehiculo": {
        "dominioVehiculo": "ARF458"
      }
    },
    "arrayMercaderias": [
      {
        "orden": 1,
        "codTipoProd": 6.24,
        "tropa": 121,
        "kilos": 50,
        "unidades": 4
      },
      {
        "orden": 2,
        "codTipoProd": 6.9,
        "tropa": 121,
        "kilos": 50,
        "unidades": 0
      }
    ]
  }
}
```

{% endtab %}

{% tab title="Python" %}

```python
# Obtenemos el TA
ta = ws.getTokenAuthorization()

# Preparamos los datos
data = {
  "authRequest": {
    "token": ta["token"],
    "sign": ta["sign"],
    "cuitRepresentada": afip.CUIT
  },
  "idReq": 410,
  "remito": {
    "tipoComprobante": 995,
    "tipoMovimiento": "ENV",
    "categoriaEmisor": 1,
    "puntoEmision": 9000,
    "cuitTitularMercaderia": 11111111111,
    "tipoReceptor": "MI",
    "categoriaReceptor": 3,
    "cuitReceptor": 22222222222,
    "codDomDestino": 3,
    "viaje": {
      "cuitTransportista": 33333333333,
      "cuitConductor": 44444444444,
      "fechaInicioViaje": "2019-02-14",
      "distanciaKm": 670,
      "vehiculo": {
        "dominioVehiculo": "ARF458"
      }
    },
    "arrayMercaderias": [
      {
        "orden": 1,
        "codTipoProd": 6.24,
        "tropa": 121,
        "kilos": 50,
        "unidades": 4
      },
      {
        "orden": 2,
        "codTipoProd": 6.9,
        "tropa": 121,
        "kilos": 50,
        "unidades": 0
      }
    ]
  }
}
```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Obtenemos el TA
var ta = await ws.GetTokenAuthorizationAsync();

// Preparamos los datos
var data = new Dictionary<string, object?>
{
    ["authRequest"] = new Dictionary<string, object?>
    {
        ["token"] = ta["token"],
        ["sign"] = ta["sign"],
        ["cuitRepresentada"] = afip.CUIT,
    },
    ["idReq"] = 410,
    ["remito"] = new Dictionary<string, object?>
    {
        ["tipoComprobante"] = 995,
        ["tipoMovimiento"] = "ENV",
        ["categoriaEmisor"] = 1,
        ["puntoEmision"] = 9000,
        ["cuitTitularMercaderia"] = 11111111111,
        ["tipoReceptor"] = "MI",
        ["categoriaReceptor"] = 3,
        ["cuitReceptor"] = 22222222222,
        ["codDomDestino"] = 3,
        ["viaje"] = new Dictionary<string, object?>
        {
            ["cuitTransportista"] = 33333333333,
            ["cuitConductor"] = 44444444444,
            ["fechaInicioViaje"] = "2019-02-14",
            ["distanciaKm"] = 670,
            ["vehiculo"] = new Dictionary<string, object?>
            {
                ["dominioVehiculo"] = "ARF458"
            }
        },
        ["arrayMercaderias"] = new[]
        {
            new Dictionary<string, object?> { ["orden"] = 1, ["codTipoProd"] = 6.24, ["tropa"] = 121, ["kilos"] = 50, ["unidades"] = 4 },
            new Dictionary<string, object?> { ["orden"] = 2, ["codTipoProd"] = 6.9,  ["tropa"] = 121, ["kilos"] = 50, ["unidades"] = 0 }
        }
    }
};
```

{% endtab %}

{% tab title="Java" %}

```java
// Obtenemos el TA
GetServiceTAResponse ta = ws.getTokenAuthorization();

// Preparamos los datos
Map<String, Object> authRequest = new HashMap<>();
authRequest.put("token", ta.getToken());
authRequest.put("sign", ta.getSign());
authRequest.put("cuitRepresentada", afip.getOptions().getCuit());

Map<String, Object> vehiculo = new HashMap<>();
vehiculo.put("dominioVehiculo", "ARF458");

Map<String, Object> viaje = new HashMap<>();
viaje.put("cuitTransportista", 33333333333L);
viaje.put("cuitConductor", 44444444444L);
viaje.put("fechaInicioViaje", "2019-02-14");
viaje.put("distanciaKm", 670);
viaje.put("vehiculo", vehiculo);

Map<String, Object> merc1 = new HashMap<>();
merc1.put("orden", 1); merc1.put("codTipoProd", 6.24); merc1.put("tropa", 121); merc1.put("kilos", 50); merc1.put("unidades", 4);

Map<String, Object> merc2 = new HashMap<>();
merc2.put("orden", 2); merc2.put("codTipoProd", 6.9); merc2.put("tropa", 121); merc2.put("kilos", 50); merc2.put("unidades", 0);

Map<String, Object> remito = new HashMap<>();
remito.put("tipoComprobante", 995);
remito.put("tipoMovimiento", "ENV");
remito.put("categoriaEmisor", 1);
remito.put("puntoEmision", 9000);
remito.put("cuitTitularMercaderia", 11111111111L);
remito.put("tipoReceptor", "MI");
remito.put("categoriaReceptor", 3);
remito.put("cuitReceptor", 22222222222L);
remito.put("codDomDestino", 3);
remito.put("viaje", viaje);
remito.put("arrayMercaderias", Arrays.asList(merc1, merc2));

Map<String, Object> data = new HashMap<>();
data.put("authRequest", authRequest);
data.put("idReq", 410);
data.put("remito", remito);
```

{% endtab %}

{% tab title="API" %}
No se requiere ninguna acción adicional.
{% endtab %}
{% endtabs %}

### **Paso 3 - Ejecutamos la solicitud**

{% tabs %}
{% tab title="Node" %}

```js
const res = await ws.executeRequest('generarRemito', data);

console.log(res);
```

{% endtab %}

{% tab title="PHP" %}

```php
$res = $ws->ExecuteRequest('generarRemito', $data);

var_dump($res);
```

{% endtab %}

{% tab title="Ruby" %}

```
res = ws.executeRequest("generarRemito", data)

puts res
```

{% endtab %}

{% tab title="Python" %}

```python
res = ws.executeRequest("generarRemito", data)

print(res)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var res = await ws.ExecuteRequestAsync<Dictionary<string, object?>>("generarRemito", data);

Console.WriteLine(JsonSerializer.Serialize(res));
```

{% endtab %}

{% tab title="Java" %}

```java
Map<String, Object> res = ws.executeRequest("generarRemito", data);

System.out.println(res);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "generarRemito",
    "wsid": "wsremcarne",
    "params": {
        "authRequest": {
            "token": "{{token}}",
            "sign": "{{sign}}",
            "cuitRepresentada": "20409378472"
        },
        "idReq": 410,
        "remito": {
            "tipoComprobante": 995,
            "tipoMovimiento": "ENV",
            "categoriaEmisor": 1,
            "puntoEmision": 9000,
            "cuitTitularMercaderia": 11111111111,
            "tipoReceptor": "MI",
            "categoriaReceptor": 3,
            "cuitReceptor": 22222222222,
            "codDomDestino": 3,
            "viaje": {
                "cuitTransportista": 33333333333,
                "cuitConductor": 44444444444,
                "fechaInicioViaje": "2019-02-14",
                "distanciaKm": 670,
                "vehiculo": {
                    "dominioVehiculo": "ARF458"
                }
            },
            "arrayMercaderias": [
                {
                    "orden": 1,
                    "codTipoProd": 6.24,
                    "tropa": 121,
                    "kilos": 50,
                    "unidades": 4
                },
                {
                    "orden": 2,
                    "codTipoProd": 6.9,
                    "tropa": 121,
                    "kilos": 50,
                    "unidades": 0
                }
            ]
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Otro web service

### Requisitos previos

Para poder usar esta guía, primero necesitarás:

* [Integrar Afip SDK en tu proyecto](/#integracion)

***

En esta documentación solo encontrarás los web services de ARCA más usados, pero en la [Referencia de API](https://afipsdk.com/docs/api-reference/introduction/) podés encontrar ejemplos de código para usar cada método de todos los web services de ARCA.

{% embed url="<https://afipsdk.com/docs/api-reference/introduction/>" %}

En caso de no encontrar en la Referencia de la API el web service que necesitás, no dudes en [contactarnos](https://afipsdk.com/contact/).

***

Aquí abajo encontrarás algunos ejemplos genéricos para los lenguajes más utilizados.

{% tabs %}
{% tab title="Node" %}

```javascript
/**
 * Nombre del web service.
 * 
 * El nombre por el cual se llama al web service en AFIP.
 * Esto lo podes encontrar en el manual correspondiente. 
 * Por ej. el de factura electronica se llama 'wsfe', el de
 * comprobantes T se llama 'wsct'  
 **/
const servicio = 'wsct';

/**
 * Creamos el web service
 **/
const genericWebService = afip.WebService(servicio, options);

/**
 * Este es un ejemplo de como utilizar el wsct para
 * obtener el ultimo comprobante autorizado
 * 
 * Aqui veras como obtener un Token Authorizataion
 * para el web service que acabamos de crear y como 
 * ejecutar un request basico
 **/
(async () => {
	/**
	 * Obtenemos el Token Authorizataion
	 **/
	const ta = await genericWebService.getTokenAuthorization();
	
	/**
	 * Preparamos los datos que nos pide el web service
	 * 
	 * Este ejemplo es especifico para el wsct. En el manual
	 * del web service que quieras utilizar encontraras que 
	 * datos requiere cada metodo
	 **/
	const data = {
		'authRequest': { 
			'token': ta.token,
			'sign' : ta.sign,
			'cuitRepresentada' : afip.CUIT
		},
		'codigoTipoComprobante': 195,
		'numeroPuntoVenta': 1
	};

	/**
	 * Iniciamos la variable donde guardaremos el resultado
	 **/
	let result;
 
	 try {
		/**
		 * Ejecutamos la request al web service
		 * 
		 * consultarUltimoComprobanteAutorizado es un metodo
		 * de wsct, esto debes cambiarlo por el metodo que 
		 * quieras utilizar
		 **/
		result = await genericWebService.executeRequest('consultarUltimoComprobanteAutorizado', data);
 
		/**
		 * Seteamos el resultado en nuestra variable.
		 * 
		 * consultarUltimoComprobanteAutorizadoReturn es especifico
		 * de este metodo de este web service. Esto deberas adaptarlo
		 * al web service que estes integrando
		 **/
		result = result.consultarUltimoComprobanteAutorizadoReturn
 
		/**
		 * Checkeamos si devolvio error en el resultado.
		 * 
		 * arrayErrores es especifico de este web service. 
		 * Esto deberas adaptarlo al web service que estes integrando
		 **/
		if (typeof result.arrayErrores !== 'undefined') {
			err = Array.isArray(result.arrayErrores.codigoDescripcion) ? result.arrayErrores.codigoDescripcion[0] : result.arrayErrores.codigoDescripcion;

			throw new Error(`(${err.codigo}) ${err.descripcion}`, err.codigo);
		}
	 }
	 catch(error){
		/**
		 * Si hubo un error lo logeamos
		 **/
		console.error(error);
	 }
 
	/**
	 * Logeamos el resultado final
	 **/
	console.log(result);
})();
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

/**
 * Nombre del web service.
 * 
 * El nombre por el cual se llama al web service en AFIP.
 * Esto lo podes encontrar en el manual correspondiente. 
 * Por ej. el de factura electronica se llama 'wsfe', el de
 * comprobantes T se llama 'wsct'  
 **/
$servicio = 'wsct';

/**
 * Creamos el web service
 **/
$generic_web_service = $afip->WebService($servicio);


/**
 * Este es un ejemplo de como utilizar el wsct para
 * obtener el ultimo comprobante autorizado
 * 
 * Aqui veras como obtener un Token Authorizataion
 * para el web service que acabamos de crear y como 
 * ejecutar un request basico
 **/

/**
 * Obtenemos el Token Authorizataion
 **/
$ta = $generic_web_service->GetTokenAuthorization();

/**
 * Preparamos los datos que nos pide el web service
 * 
 * Este ejemplo es especifico para el wsct. En el manual
 * del web service que quieras utilizar encontraras que 
 * datos requiere cada metodo
 **/
$data = array(
	'authRequest' => array( 
		'token' => $ta->token,
		'sign' 	=> $ta->sign,
		'cuitRepresentada' 	=> $afip->CUIT
	),
	'codigoTipoComprobante' => 195,
	'numeroPuntoVenta' => 1
);

/**
 * Ejecutamos la request al web service
 * 
 * consultarUltimoComprobanteAutorizado es un metodo
 * de wsct, esto debes cambiarlo por el metodo que 
 * quieras utilizar
 **/
$result = $generic_web_service->ExecuteRequest('consultarUltimoComprobanteAutorizado', $data);

/**
 * Seteamos el resultado en nuestra variable.
 * 
 * consultarUltimoComprobanteAutorizadoReturn es especifico
 * de este metodo de este web service. Esto deberas adaptarlo
 * al web service que estes integrando
 **/
$result = $result->consultarUltimoComprobanteAutorizadoReturn;

/**
 * Checkeamos si devolvio error en el resultado.
 * 
 * arrayErrores es especifico de este web service. 
 * Esto deberas adaptarlo al web service que estes integrando
 **/
if (isset($result->arrayErrores)) {
	$err = is_array($result->arrayErrores->codigoDescripcion) ? $result->arrayErrores->codigoDescripcion[0] : $result->arrayErrores->codigoDescripcion;

	throw new Exception('('.$err->codigo.') '.$err->descripcion, $err->codigo);
}

/**
 * Mostramos por pantalla el resultado final
 **/
var_dump($result);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
# Nombre del web service.
#
# El nombre por el cual se llama al web service en AFIP.
# Esto lo podes encontrar en el manual correspondiente.
# Por ej. el de factura electronica se llama "wsfe", el de
# comprobantes T se llama "wsct"
servicio = "wsct"

# Creamos el web service
genericWebService = afip.webService(servicio)

# Este es un ejemplo de como utilizar el wsct para
# obtener el ultimo comprobante autorizado
#
# Aqui veras como obtener un Token Authorizataion
# para el web service que acabamos de crear y como
# ejecutar un request basico

# Obtenemos el Token Authorizataion
ta = genericWebService.getTokenAuthorization

# Preparamos los datos que nos pide el web service
#
# Este ejemplo es especifico para el wsct. En el manual
# del web service que quieras utilizar encontraras que
# datos requiere cada metodo
data = {
  "authRequest": {
    "token": ta["token"],
    "sign": ta["sign"],
    "cuitRepresentada": afip.CUIT
  },
  "codigoTipoComprobante": 195,
  "numeroPuntoVenta": 1
}

begin
  # Ejecutamos la request al web service
  #
  # consultarUltimoComprobanteAutorizado es un metodo
  # de wsct, esto debes cambiarlo por el metodo que
  # quieras utilizar
  result = genericWebService.executeRequest("consultarUltimoComprobanteAutorizado", data)

  # Mostramos el resultado
  puts result unless result["arrayErrores"]

  # Checkeamos si devolvio error en el resultado.
  #
  # arrayErrores es especifico de este web service.
  # Esto deberas adaptarlo al web service que estes integrando
  err = result["arrayErrores"]["codigoDescripcion"].is_a?(Array) ? result["arrayErrores"]["codigoDescripcion"][0] : result["arrayErrores"]["codigoDescripcion"]

  raise "(#{err["codigo"]}) #{err["descripcion"]}"
rescue => e
  # Mostramos el error
  puts e
end
```

{% endtab %}

{% tab title="Python" %}

```python
# Nombre del web service.
#
# El nombre por el cual se llama al web service en AFIP.
# Esto lo podes encontrar en el manual correspondiente.
# Por ej. el de factura electronica se llama "wsfe", el de
# comprobantes T se llama "wsct"
servicio = "wsct"

# Creamos el web service
genericWebService = afip.webService(servicio)

# Este es un ejemplo de como utilizar el wsct para
# obtener el ultimo comprobante autorizado
#
# Aqui veras como obtener un Token Authorizataion
# para el web service que acabamos de crear y como
# ejecutar un request basico

# Obtenemos el Token Authorizataion
ta = genericWebService.getTokenAuthorization()

# Preparamos los datos que nos pide el web service
#
# Este ejemplo es especifico para el wsct. En el manual
# del web service que quieras utilizar encontraras que
# datos requiere cada metodo
data = {
  "authRequest": {
    "token": ta["token"],
    "sign": ta["sign"],
    "cuitRepresentada": afip.CUIT
  },
  "codigoTipoComprobante": 195,
  "numeroPuntoVenta": 1
}

try:
  # Ejecutamos la request al web service
  #
  # consultarUltimoComprobanteAutorizado es un metodo
  # de wsct, esto debes cambiarlo por el metodo que
  # quieras utilizar
  result = genericWebService.executeRequest("consultarUltimoComprobanteAutorizado", data)['consultarUltimoComprobanteAutorizadoReturn']

  if result.get("arrayErrores"):

    # Checkeamos si devolvio error en el resultado.
    #
    # arrayErrores es especifico de este web service.
    # Esto deberas adaptarlo al web service que estes integrando
    err = result["arrayErrores"]["codigoDescripcion"][0] if type(result["arrayErrores"]["codigoDescripcion"]) in (tuple, list) else result["arrayErrores"]["codigoDescripcion"]

    raise Exception("(%s) %s" % (err["codigo"], err["descripcion"])) 

  # Mostramos el resultado
  print(result)

except Exception as e:
  # Mostramos el error
  print(e)

```

{% endtab %}

{% tab title=".NET" %}

```csharp
// Nombre del web service.
//
// El nombre por el cual se llama al web service en AFIP.
// Esto lo podes encontrar en el manual correspondiente.
// Por ej. el de factura electronica se llama "wsfe", el de
// comprobantes T se llama "wsct"
string servicio = "wsct";

// Creamos el web service
AfipWebService genericWebService = afip.WebService(servicio);

// Obtenemos el Token Authorization
var ta = await genericWebService.GetTokenAuthorizationAsync();

// Preparamos los datos que nos pide el web service
//
// Este ejemplo es especifico para el wsct. En el manual
// del web service que quieras utilizar encontraras que
// datos requiere cada metodo
var data = new Dictionary<string, object?>
{
    ["authRequest"] = new Dictionary<string, object?>
    {
        ["token"] = ta["token"],
        ["sign"] = ta["sign"],
        ["cuitRepresentada"] = afip.CUIT
    },
    ["codigoTipoComprobante"] = 195,
    ["numeroPuntoVenta"] = 1
};

try
{
    // Ejecutamos la request al web service
    //
    // consultarUltimoComprobanteAutorizado es un metodo
    // de wsct, esto debes cambiarlo por el metodo que
    // quieras utilizar
    var result = await genericWebService.ExecuteRequestAsync<Dictionary<string, object?>>("consultarUltimoComprobanteAutorizado", data);

    // Mostramos el resultado
    Console.WriteLine(JsonSerializer.Serialize(result));
}
catch (Exception ex)
{
    // Si hubo un error lo logeamos
    Console.Error.WriteLine(ex.Message);
}
```

{% endtab %}

{% tab title="Java" %}

```java
import com.afipsdk.AfipWebService;
import com.afipsdk.model.GetServiceTAResponse;
import java.util.*;

// Nombre del web service.
//
// El nombre por el cual se llama al web service en AFIP.
// Esto lo podes encontrar en el manual correspondiente.
// Por ej. el de factura electronica se llama "wsfe", el de
// comprobantes T se llama "wsct"
String servicio = "wsct";

// Creamos el web service
AfipWebService genericWebService = afip.webService(servicio);

// Obtenemos el Token Authorization
GetServiceTAResponse ta = genericWebService.getTokenAuthorization();

// Preparamos los datos que nos pide el web service
//
// Este ejemplo es especifico para el wsct. En el manual
// del web service que quieras utilizar encontraras que
// datos requiere cada metodo
Map<String, Object> authRequest = new HashMap<>();
authRequest.put("token", ta.getToken());
authRequest.put("sign", ta.getSign());
authRequest.put("cuitRepresentada", afip.getOptions().getCuit());

Map<String, Object> data = new HashMap<>();
data.put("authRequest", authRequest);
data.put("codigoTipoComprobante", 195);
data.put("numeroPuntoVenta", 1);

try {
    // Ejecutamos la request al web service
    //
    // consultarUltimoComprobanteAutorizado es un metodo
    // de wsct, esto debes cambiarlo por el metodo que
    // quieras utilizar
    Map<String, Object> result = genericWebService.executeRequest("consultarUltimoComprobanteAutorizado", data);

    // Mostramos el resultado
    System.out.println(result);
} catch (Exception ex) {
    // Si hubo un error lo logeamos
    System.err.println(ex.getMessage());
}
```

{% endtab %}

{% tab title="API" %}
Es similar a llamar a otros web services

\
**Body**

**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/requests`

**Ejemplo**

```json
{
    "environment": "dev",
    "method": "consultarUltimoComprobanteAutorizado",
    "wsid": "wsct",
    "params": {
        "authRequest": {
            "token": "{{token}}",
            "sign": "{{sign}}",
            "cuitRepresentada": "20409378472"
        },
        "codigoTipoComprobante": 195,
        "numeroPuntoVenta": 1
    }
}
```

{% endtab %}
{% endtabs %}


# Ir a producción

### 1. Obtener certificado de producción

Si aún no lo hiciste, en este momento necesitas obtener los certificados de producción. Aquí te dejo una guía sobre cómo obtenerlos.

{% embed url="<https://afipsdk.com/blog/como-obtener-certificado-para-web-services-arca/>" %}

### 2. Cambiar los parámetros

{% tabs %}
{% tab title="Node" %}
Debes agregar el `cert`, `key` y configurar `production` en `true`.

```javascript
import Afip from '@afipsdk/afip.js';
import fs from 'fs';

// Certificado (Puede estar guardado en archivos, DB, etc)
const cert = fs.readFileSync('./certificado.crt', {encoding: 'utf8'});

// Key (Puede estar guardado en archivos, DB, etc)
const key = fs.readFileSync('./key.key', {encoding: 'utf8'});

const afip = new Afip({ 
    CUIT: 20111111112,
    cert: cert,
    key: key,
    access_token: 'access_token obtenido en https://app.afipsdk.com/',
    production: true
});
```

{% endtab %}

{% tab title="PHP" %}
Debes agregar el `cert`, `key` y configurar `production` en `true`.

<pre class="language-php"><code class="lang-php">// Certificado (Puede estar guardado en archivos, DB, etc)
$cert = file_get_contents('./certificado.crt');

// Key (Puede estar guardado en archivos, DB, etc)
$key = file_get_contents('./key.key');

<strong>$afip = new Afip(array(
</strong>    'CUIT' => 20111111112,
    'cert' => $cert,
    'key' => $key,
    'access_token' => 'access_token obtenido en https://app.afipsdk.com/',
    'production' => TRUE
));
</code></pre>

{% endtab %}

{% tab title="Ruby" %}
Debes agregar el `cert`, `key` y configurar `production` en `true`.

```ruby
# Certificado (Puede estar guardado en archivos, DB, etc)
cert = File.read("./certificado.crt")

# Key (Puede estar guardado en archivos, DB, etc)
key = File.read("./key.key")

afip = Afip.new({ 
    "CUIT": 20111111112,
    "cert": cert,
    "key": key,
    "access_token": "access_token obtenido en https://app.afipsdk.com/",
    "production": true
})
```

{% endtab %}

{% tab title="Python" %}
Debes agregar el `cert`, `key` y configurar `production` en `true`.

```python
# Certificado (Puede estar guardado en archivos, DB, etc)
cert = open("./certificado.crt").read()

# Key (Puede estar guardado en archivos, DB, etc)
key = open("./key.key").read()

afip = Afip({ 
    "CUIT": 20111111112,
    "cert": cert,
    "key": key,
    "access_token": "access_token obtenido en https://app.afipsdk.com/",
    "production": True
})
```

{% endtab %}

{% tab title=".NET" %}
Debes agregar el `Cert`, `Key` y configurar `Production` en `true`.

```csharp
// Certificado (Puede estar guardado en archivos, DB, etc)
string cert = "-----BEGIN CERTIFICATE-----\nMIIDRzC...";

// Key (Puede estar guardado en archivos, DB, etc)
string key = "-----BEGIN RSA PRIVATE KEY-----\r\nMIIEowIBAAKCA...";

var afip = new Afip(new AfipOptions
{
    CUIT = 20111111112,
    Cert = cert,
    Key = key,
    AccessToken = "access_token obtenido en https://app.afipsdk.com/",
    Production = true
});
```

{% endtab %}

{% tab title="Java" %}
Debes agregar el `cert`, `key` y configurar `production` en `true`.

```java
// Certificado (Puede estar guardado en archivos, DB, etc)
String cert = "-----BEGIN CERTIFICATE-----\nMIIDRzC...";

// Key (Puede estar guardado en archivos, DB, etc)
String key = "-----BEGIN RSA PRIVATE KEY-----\r\nMIIEowIBAAKCA...";

AfipOptions options = new AfipOptions();
options.setCuit(20111111112L);
options.setCert(cert);
options.setKey(key);
options.setAccessToken("access_token obtenido en https://app.afipsdk.com/");
options.setProduction(true);

Afip afip = new Afip(options);
```

{% endtab %}

{% tab title="API" %}
En los requests cambiar el parámetro `environment: prod`

```json
{
    "environment": "prod"
}
```

En los request de Autorización agregarle el cert y key de producción

```json
{
    "environment": "prod",
    "cert": "-----BEGIN CERTIFICATE-----\nMIIDRzC...",
    "key": "-----BEGIN RSA PRIVATE KEY-----\r\nMIIEowIBAAKCA..."
}
```

{% endtab %}
{% endtabs %}

Eso es todo. Los requests que realices con esta configuración ya van a impactar en los web services de producción.


# Tutoriales página de ARCA

Los tutoriales de ARCA pueden ser difíciles de entender por ello se hicieron estos tutoriales mas simples para explicar como tramitar los certificados y permisos.


# Habilitar administrador de certificados de testing

Para agregar la aplicación **«WSASS - Autogestión Certificados Homologación»** a nuestro escritorio de ARCA primero debemos ingresar en **«Administrador de Relaciones de Clave Fiscal»**

<figure><img src="/files/X6mBj7yP8Jfq8PkeHToe" alt=""><figcaption></figcaption></figure>

En caso de tener permiso para administrar las relaciones de otros contribuyentes deberemos elegir el que queremos administrar, caso contrario se elegirá el nuestro automáticamente. Siempre en modo testing recomendamos usar el usuario de uno mismo.

<figure><img src="/files/tkUG4kcbNZBuerdrCdSc" alt=""><figcaption></figcaption></figure>

Luego elegimos «Adherir servicio»

<figure><img src="/files/J10PKxcqrn1foRRJgYB9" alt=""><figcaption></figcaption></figure>

Allí dentro elegimos «ARCA > Servicios interactivos > WSASS - Autogestión Certificados Homologación»

<figure><img src="/files/Qmvr0zbgAohrMdNB826A" alt=""><figcaption></figcaption></figure>

Le damos a confirmar y ya tendremos acceso a la aplicación desde nuestro escritorio de ARCA

<figure><img src="/files/RV3K4CdoEYZ848ri3Sdy" alt=""><figcaption></figcaption></figure>


# Obtener certificado de testing

{% hint style="info" %}
Si querés evitar este trabajo manual, podés hacerlo automáticamente a través de tu sistema con la [automatización para Crear certificado de desarrollo](https://afipsdk.com/docs/automations/create-cert-dev/nodejs/).
{% endhint %}

## Paso 1 - Instalar OpenSSL

Para la generación del certificado vamos a usar OpenSLL, el cual ya viene en los sistemas Linux/Unix. Para Windows se puede descargar desde <https://sourceforge.net/projects/openssl/>, una vez descargado copiar la carpeta `bin` en `C:\` con el nombre `OpenSSL`.

Ahora debemos abrir una consola. En Windows se debe abrir en modo administrador y navegar hacia `C:\OpenSSL`

## Paso 2 - Generar la clave de cifrado (key)

Dentro de la consola lo primero que debemos ejecutar es el siguiente comando para generar el archivo key.

```bash
openssl genrsa -traditional -out [nombre de archivo] 2048
```

Reemplazando:

> * `[nombre de archivo]` con el nombre que querés que se guarde el archivo key.

Este archivo key es muy importante porque representa la «contraseña» con la que va a funcionar el certificado así que no debemos perderlo.

Por ejemplo yo voy a generarlo de la siguiente forma

```
openssl genrsa -traditional -out keytest 2048
```

{% hint style="warning" %}
Las versiones mas antiguas de OpenSSL no soportan el parámetro -traditional, si no te funciona borralo
{% endhint %}

De esta forma el nombre de mi archivo key seria `keytest`

## Paso 3 - Generar el Certificate Signing Request (csr)

Una vez generada la key estamos listos para generar el CSR. Para ello debemos ejecutar el siguiente comando:

```
openssl req -new -key [nombre de archivo key] -subj "/C=AR/O=[nombre de la empresa]/CN=[nombre del certificado]/serialNumber=CUIT [CUIT]" -out [nombre de archivo para el CSR]
```

Reemplazando:

> * `[nombre de archivo key]` con el nombre del archivo key generado en el paso anterior.
> * `[nombre de la empresa]` con el nombre de la empresa para quien es el certificado. En testing recomendamos utilizar el nombre de uno para no generar confusiones.
> * `[nombre del certificado]` con el nombre que quieres que tenga el certificado. Solo se pueden utilizar letras y números. Esto es a modo de que puedas reconocerlo luego en la pagina de AFIP si generas varios certificados para diferentes sistemas.
> * `[CUIT]` con el CUIT de la empresa para quien es el certificado. De nuevo, en testing recomendamos usar el CUIT de uno para no generar confusiones.
> * `[nombre de archivo para el CSR]` con el nombre que quieres que se guarde el archivo CSR

Por ejemplo yo lo generaría de la siguiente forma

```bash
openssl req -new -key keytest -subj "/C=AR/O=IvanM/CN=Test1/serialNumber=CUIT 11111111111" -out csr-test1
```

Donde en `11111111111` pondría mi CUIT

Teniendo el archivos CSR ya podemos dirigirnos a la página de ARCA para generar el certificado.

{% hint style="warning" %}
ATENCIÓN: El archivo CSR no es lo mismo que el certificado, suele ser un error común confundirlos al momento de usar el certificado
{% endhint %}

## Paso 4 - Generar el certificado (cert)

Dentro de nuestro escritorio de ARCA debemos ingresar en **«WSASS - Autogestión Certificados Homologación»**

<figure><img src="/files/qcKTRKqPulm5ZqVZA7Yn" alt=""><figcaption></figcaption></figure>

En caso de no tener esta aplicación en tu escritorio debes ver el tutorial [Habilitar administrador de certificados de testing](/recursos/tutoriales-pagina-de-arca/habilitar-administrador-de-certificados-de-testing)

Dentro de esta aplicación debemos ir a «Nuevo Certificado»

<figure><img src="/files/7udk4U0rPRevMMX8CA1d" alt="" width="563"><figcaption></figcaption></figure>

Allí en `1. Nombre simbólico del DN` debemos colocar el nombre que le pusimos al certificado dentro del CSR.

En `2. Solicitud del certificado en formato PKCS#10` debemos pegar el contenido de nuestro CSR.

{% hint style="info" %}
El CSR lo podes abrir con cualquier editor de texto para ver su contenido en texto plano.
{% endhint %}

Y luego apretar `Crear DN y obtener certificado`. En mi caso quedaría así

<figure><img src="/files/idUosyvtQOVnv7iNsLSD" alt="" width="563"><figcaption></figcaption></figure>

Y debajo se nos generara el certificado, este debemos guardarlo en nuestra computadora junto con la key para usarlo luego en la librería.

{% hint style="info" %}
El CSR ya no lo necesitaremos, podemos eliminarlo.
{% endhint %}

Ahora lo que nos falta por hacer es autorizar a que con este certificado se pueda acceder al/los web service/s que queramos usar.


# Autorizar web service de testing

{% hint style="info" %}
Si querés evitar este trabajo manual, podés hacerlo automáticamente a través de tu sistema con la [automatización para Autorizar web service de desarrollo](https://afipsdk.com/docs/automations/auth-web-service-dev/nodejs/).
{% endhint %}

Para que los certificados puedan acceder a un web service se debe crear una autorización, esto se hace de la siguiente manera:

Dentro de **«WSASS - Autogestión Certificados Homologación»**, que anteriormente en [Obtener certificado de testing](/recursos/tutoriales-pagina-de-arca/obtener-certificado-de-testing#paso-4-generar-el-certificado-cert) explicamos cómo ingresar, debemos ir a «Crear autorización a servicio»

<figure><img src="/files/d0WyqjRSGD5zRt3MM85H" alt="" width="563"><figcaption></figcaption></figure>

Allí dentro en `1. Nombre simbólico del DN a autorizar` debemos seleccionar el certificado que queremos autorizar.

En `3. CUIT representado` debemos ingresar el CUIT con el cual queremos utilizar el web service. En modo testing recomendamos usar el CUIT propio para no crear confusión.

Y en `5. Servicio al que desea acceder` debemos elegir el web service a utilizar.\`

Con todo esto listo debemos presionar en «Crear autorización de acceso»

Por ejemplo para autorizar al Web service de factura electrónica me quedaría así

<figure><img src="/files/fM0p8fYIjeIAA93X7cFt" alt="" width="563"><figcaption></figcaption></figure>

Luego ingresamos en «Autorizaciones» para verificar que se creó la autorización correctamente

<figure><img src="/files/9ZpqKHtHwYsWbYSKl3Yp" alt="" width="563"><figcaption></figcaption></figure>

Eso sería todo, ya estamos listos para usar el certificado con el web service autorizado


# Habilitar administrador de certificados de producción

Para agregar la aplicación **«Administración de Certificados Digitales»** a nuestro escritorio de ARCA primero debemos ingresar en **«Administrador de Relaciones de Clave Fiscal»**

<figure><img src="/files/Dj5stOpmzbJQpo7D8pd4" alt=""><figcaption></figcaption></figure>

En caso de tener permiso para administrar las relaciones de otros contribuyentes deberemos elegir el que queremos administrar, caso contrario se elegirá el nuestro automáticamente. Siempre en modo testing recomendamos usar el usuario de uno mismo.

<figure><img src="/files/sDpmUQXI0dD404RHpd6M" alt=""><figcaption></figcaption></figure>

Luego elegimos «Adherir servicio»

<figure><img src="/files/J10PKxcqrn1foRRJgYB9" alt=""><figcaption></figcaption></figure>

Allí dentro elegimos «ARCA > Servicios interactivos > Administración de Certificados Digitales»

<figure><img src="/files/PEbcRrd2qWf0NaGAaSEj" alt=""><figcaption></figcaption></figure>

Le damos a confirmar y ya tendremos acceso a la aplicación desde nuestro escritorio de ARCA

<figure><img src="/files/xvJEly90ylHfh4GJ2OjU" alt=""><figcaption></figcaption></figure>


# Obtener certificado de producción

{% hint style="info" %}
Si querés evitar este trabajo manual, podés hacerlo automáticamente a través de tu sistema con la [automatización para Crear certificado de producción](https://afipsdk.com/docs/automations/create-cert-prod/nodejs/).
{% endhint %}

## Paso 1 - Instalar OpenSSL

Para la generación del certificado vamos a usar OpenSLL, el cual ya viene en los sistemas Linux/Unix. Para Windows se puede descargar desde <https://sourceforge.net/projects/openssl/>, una vez descargado copiar la carpeta `bin` en `C:\` con el nombre `OpenSSL`.

Ahora debemos abrir una consola. En Windows se debe abrir en modo administrador y navegar hacia `C:\OpenSSL`

## Paso 2 - Generar la clave de cifrado (key)

Dentro de la consola lo primero que debemos ejecutar es el siguiente comando para generar el archivo key.

```bash
openssl genrsa -traditional -out [nombre de archivo] 2048
```

Reemplazando:

> * `[nombre de archivo]` con el nombre que querés que se guarde el archivo key.

Este archivo key es muy importante porque representa la «contraseña» con la que va a funcionar el certificado así que no debemos perderlo.

Por ejemplo yo voy a generarlo de la siguiente forma

```
openssl genrsa -traditional -out keytest 2048
```

De esta forma el nombre de mi archivo key seria `keytest`

{% hint style="info" %}
Las versiones mas antiguas de OpenSSL no soportan el parámetro -traditional, si no te funciona borralo
{% endhint %}

## Paso 3 - Generar el Certificate Signing Request (csr)

Una vez generada la key estamos listos para generar el CSR. Para ello debemos ejecutar el siguiente comando

```
openssl req -new -key [nombre de archivo para la key] -subj "/C=AR/O=[nombre de la empresa]/CN=[nombre del certificado]/serialNumber=CUIT [CUIT]" -out [nombre de archivo para el CSR]
```

Reemplazando:

> * `nombre de archivo para la key` con el nombre del archivo key generado anteriormente.
> * `nombre de la empresa` con el nombre de la empresa para quien es el certificado.
> * `nombre del certificado` con el nombre que quieres que tenga el certificado. Solo se pueden utilizar letras y números. Esto es a modo de que puedas reconocerlo luego si generas varios certificados para diferentes sistemas
> * `CUIT` con el CUIT de la empresa para quien es el certificado.
> * `nombre de archivo para el CSR` con el nombre que quieres que se guarde el archivo CSR

Por ejemplo yo lo generaría de la siguiente forma

```
openssl req -new -key keyproduccion -subj "/C=AR/O=Nombre Empresa/CN=Test1/serialNumber=CUIT 11111111111" -out csr-produccion
```

Donde en «Nombre Empresa» pondría el nombre de la empresa y en «11111111111» podía el CUIT de la empresa

Teniendo el archivos CSR ya podemos dirigirnos a la página de AFIP para generar el certificado.

{% hint style="warning" %}
ATENCIÓN: El archivo CSR no es lo mismo que el certificado, suele ser un error común confundirlos al momento de usar el certificado
{% endhint %}

## Paso 4 - Generar el certificado (cert)

Dentro de nuestro escritorio de AFIP debemos ingresar en **«Administración de Certificados Digitales»**

<figure><img src="/files/UzrKPNDyQenjR5yG6mkJ" alt=""><figcaption></figcaption></figure>

En caso de no tener esta aplicación en tu escritorio debes ver el tutorial [Habilitar administrador de certificados de producción](/recursos/tutoriales-pagina-de-arca/habilitar-administrador-de-certificados-de-produccion)

En caso de tener permiso para administrar las relaciones de otros contribuyentes nos hará elegir el de quien queremos administrar.

<figure><img src="/files/sDpmUQXI0dD404RHpd6M" alt=""><figcaption></figcaption></figure>

Dentro de esta aplicación debemos ir a «Agregar alias»

<figure><img src="/files/GWSZBzdmN7iyhh6QKGTL" alt=""><figcaption></figcaption></figure>

Allí en «Alias» debemos colocar el nombre que le pusimos el certificado dentro del CSR.

Luego presionamos examinar y elegimos el CSR que generamos anteriormente.

Por ultimo presionamos «Agregar Alias» y ya tenemos nuestro certificado

<figure><img src="/files/urZVSWCRQ3ZtrsUjvHK4" alt=""><figcaption></figcaption></figure>

Ahora en la lista de Alias presionamos «ver»

<figure><img src="/files/A60E8pFsJoY5cxDvQYVo" alt=""><figcaption></figcaption></figure>

Y allí presionamos el boto debajo de «descargar»

<figure><img src="/files/H6LAiLDF6iauUdnTzm88" alt=""><figcaption></figcaption></figure>

Y eso es todo ya tenemos nuestro certificado y la key para usarlos luego en la librería.

{% hint style="info" %}
El CSR ya no lo necesitaremos, podemos eliminarlo.
{% endhint %}

Ahora lo que nos queda es autorizar a que con este certificado se pueda acceder al/los web service/s que queramos usar.


# Autorizar web service de producción

{% hint style="info" %}
Si querés evitar este trabajo manual, podés hacerlo automáticamente a través de tu sistema con la [automatización para Autorizar web service de producción](https://afipsdk.com/docs/automations/auth-web-service-prod/nodejs/).
{% endhint %}

Para Autorizar a que se pueda acceder a un web service de producción con un certificado previamente creado debemos ingresar a «Administrador de Relaciones de Clave Fiscal» dentro de nuestro escritorio de ARCA

<figure><img src="/files/Dj5stOpmzbJQpo7D8pd4" alt=""><figcaption></figcaption></figure>

En caso de poder administrar las cuentas de varios contribuyentes desde nuestro escritorio deberemos elegir el que queremos administrar.

<figure><img src="/files/sDpmUQXI0dD404RHpd6M" alt=""><figcaption></figcaption></figure>

Ahora debemos ir a «Nueva Relación»

<figure><img src="/files/d5YziVfc5TlqKfvKnD8r" alt=""><figcaption></figcaption></figure>

Si estas vinculando un web service delegado por alguien mas en la parte de «Representado» debes elegir el CUIT de quien te realizo la delegación; sino te aparecerá seleccionado tu propio CUIT.

Luego presionamos «Buscar»

<figure><img src="/files/9kBhErhfIst0KhBaXWjX" alt=""><figcaption></figcaption></figure>

Abrimos «ARCA > Web Services» y elegimos el web service que queremos autorizar

<figure><img src="/files/Aw2wBFM8YvvmB4JMpIIk" alt=""><figcaption></figcaption></figure>

Luego presionamos en el segundo botón de «Buscar»

<figure><img src="/files/UIEM0qzX5neuDHDfvKIM" alt=""><figcaption></figcaption></figure>

Elegimos el certificado que queremos autorizar y le damos a «Confirmar»

<figure><img src="/files/fkU82TlhAaqXYyzFnnmW" alt=""><figcaption></figcaption></figure>

Nuevamente le damos a «Confirmar»

<figure><img src="/files/KaAv2DJUCB8pBOvUbdSm" alt=""><figcaption></figcaption></figure>

Y listo ya podemos utilizar el web service que autorizamos con el certificado elegido.


# Crear punto de venta

En caso de emitir facturas electrónicas debes disponer de un punto de venta compatible. Podes darlo de alta darlo de alta a través del servicio «Administración de puntos de venta y domicilios».

<figure><img src="/files/XZHTnRQQnfweZ5YfyjL0" alt=""><figcaption></figcaption></figure>

Ingresar en la opción "A/B/M de puntos de venta". Hacé click en agregar nuevo punto de venta y elegir la opción correspondiente para tu caso:

<figure><img src="/files/XWIFluipYUYNjcW727qP" alt="" width="534"><figcaption><p>Para monotributista "Factura Electronica - Monotributo - Web Service".</p></figcaption></figure>

<figure><img src="/files/JwSL4Gvn0Ltybqbxkfbp" alt="" width="563"><figcaption><p>Para responsable inscripto "RECE para aplicativo y Web Service".</p></figcaption></figure>

Le das a «Aceptar» y listo, ya podes utilizar el web service de facturación electronica con dicho punto de venta


# Delegar web service

{% hint style="info" %}
Si querés evitar este trabajo manual, podés hacerlo automáticamente a través de tu sistema con la [automatización para Delegar un web service](https://afipsdk.com/docs/automations/delegate-web-service/nodejs/).
{% endhint %}

Para permitir que alguien mas use un servicio de ARCA a nuestro nombre debemos delegarle dicho servicio.

Ingresar a «Administrador de Relaciones de Clave Fiscal» dentro de nuestro escritorio de ARCA

<figure><img src="/files/Dj5stOpmzbJQpo7D8pd4" alt=""><figcaption></figcaption></figure>

En caso de poder administrar las cuentas de varios contribuyentes desde nuestro escritorio deberemos elegir el que queremos administrar.

<figure><img src="/files/sDpmUQXI0dD404RHpd6M" alt=""><figcaption></figcaption></figure>

Ahora debemos ir a «Nueva Relación»

<figure><img src="/files/d5YziVfc5TlqKfvKnD8r" alt=""><figcaption></figcaption></figure>

Allí dentro presionamos «Buscar»

<figure><img src="/files/9kBhErhfIst0KhBaXWjX" alt=""><figcaption></figcaption></figure>

Abrimos «ARCA > Web Services» y elegimos el web service que queremos autorizar

<figure><img src="/files/Aw2wBFM8YvvmB4JMpIIk" alt=""><figcaption></figcaption></figure>

Luego presionamos en el segundo botón de «Buscar»

<figure><img src="/files/UIEM0qzX5neuDHDfvKIM" alt=""><figcaption></figcaption></figure>

Ingresar el CUIT de a quien le va a delegar el servicio y click en «Buscar»

<figure><img src="/files/F4HlxqLnE44zLJWRLX88" alt=""><figcaption></figcaption></figure>

Le damos a «Confirmar»

<figure><img src="/files/PrJLfqYacoBhXXGzhR5t" alt=""><figcaption></figcaption></figure>

Nuevamente la damos a «Confirmar»

<figure><img src="/files/31TFZuCPWxosJSJ3QndA" alt=""><figcaption></figcaption></figure>

Y listo ya solo falta que el autorizado lo acepte.


# Aceptar delegación de web service

{% hint style="info" %}
Si querés evitar este trabajo manual, podés hacerlo automáticamente a través de tu sistema con la [automatización para Aceptar delegación de web service](https://afipsdk.com/docs/automations/accept-web-service-delegation/nodejs/).
{% endhint %}

Primero te deben delegar el acceso a un web service siguiendo el siguiente tutorial

{% content-ref url="/pages/CvhZB9PvdNy5746OevQ7" %}
[Delegar web service](/recursos/tutoriales-pagina-de-arca/delegar-web-service)
{% endcontent-ref %}

{% hint style="info" %}
Podes enviarle a tu cliente directamente el enlace al tutorial, de manera que sea sencillo de entender
{% endhint %}

En la página de ARCA entrar en la app «Aceptación de Designación»

<figure><img src="/files/GNgToovk5PSMdJlRR6pZ" alt=""><figcaption></figcaption></figure>

En caso de que el usuario haya autorizado correctamente en esa lista aparece autorización a confirmar. Click en «Aceptar»

<figure><img src="/files/lCrqESqcoY6RadLE4bpY" alt=""><figcaption></figcaption></figure>

Una vez que echo esto lo que queda es [Obtener certificado de producción](/recursos/tutoriales-pagina-de-arca/obtener-certificado-de-produccion), si aun no lo hiciste, y por ultimo seguir el tutorial [Autorizar a un web service de producción](/recursos/tutoriales-pagina-de-arca/autorizar-web-service-de-produccion) pero cambiando que en la parte de elegir el «Representado» debes elegir el CUIT que te dio la autorización.


# Otros métodos útiles

## Obtener XML de la ultima solicitud realizada

Hay momentos en los cuales obtenemos un error y no sabemos como resolverlo, lo que podemos hacer es enviar un correo a **<sri@arca.gob.ar>** explicando el problema y adjuntarles el XML de solicitud y respuesta que te dio el web service para que te den una respuesta. Con ese método obtenés dicho XML.

Recordá utilizar a este método luego de llamar al web service y no antes porque lo que te devuelve es el XML ultima solicitud.

{% tabs %}
{% tab title="Node" %}

```javascript
const res = await afip.getLastRequestXML();

console.log(res);
```

{% endtab %}

{% tab title="PHP" %}

```php
$res = $afip->GetLastRequestXML();

var_dump($res);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
res = afip.getLastRequestXML

puts res
```

{% endtab %}

{% tab title="Python" %}

```python
res = afip.getLastRequestXML()

print(res)
```

{% endtab %}

{% tab title=".NET" %}

```csharp
var res = await afip.GetLastRequestXmlAsync();

Console.WriteLine(JsonSerializer.Serialize(res));
```

{% endtab %}

{% tab title="Java" %}

```java
GetLastRequestXmlResponse res = afip.getLastRequestXml();

System.out.println(res);
```

{% endtab %}

{% tab title="API" %}
**Endpoint**

<mark style="color:blue;">`GET`</mark> `https://app.afipsdk.com/api/v1/afip/requests/last-xml`

**Response**

<mark style="color:green;">`STATUS`</mark> `200`

```json
{
    "request": "<?xml version=\"1.0\" encoding...",
    "response": "<soap:Envelope xmlns:soap=..."
}
```

{% endtab %}
{% endtabs %}

## Forzar la solicitud de un nuevo TA

{% hint style="info" %}
Los **TA (token authorization)** **son archivos de ARCA,** manejados automáticamente por la Afip SDK, que contienen la información para poder comunicarse con los web services.
{% endhint %}

El TA dura 12hs y queda cacheado para no solicitarlo todo el tiempo, pero hay momentos en los cuales obtenemos un error y la forma de solucionarlo es descartando el TA actual. Con este método podes forzar a que se renueve.

{% tabs %}
{% tab title="Node" %}
En cualquier web service podes llamar al método `getTokenAuthorization(true);` . El parámetro `true` fuerza la renovación. Por ej:

```javascript
const ta = await afip.ElectronicBilling.getTokenAuthorization(true);

console.log(ta);
```

{% endtab %}

{% tab title="PHP" %}
En cualquier web service podes llamar al método `GetTokenAuthorization(TRUE);` . El parámetro `true` fuerza la renovación. Por ej:

```javascript
$ta = $afip->ElectronicBilling->getTokenAuthorization(TRUE);

var_dump($ta);
```

{% endtab %}

{% tab title="Ruby" %}
En cualquier web service podes llamar al método `getTokenAuthorization(true)` . El parámetro `true` fuerza la renovación. Por ej:

```ruby
ta = afip.ElectronicBilling.getTokenAuthorization(true)

puts ta
```

{% endtab %}

{% tab title="Python" %}
En cualquier web service podes llamar al método `getTokenAuthorization(True)` . El parámetro `true` fuerza la renovación. Por ej:

```python
ta = afip.ElectronicBilling.getTokenAuthorization(True)

print(ta)
```

{% endtab %}

{% tab title=".NET" %}
En cualquier web service podes llamar al método `GetTokenAuthorizationAsync(true)` . El parámetro `true` fuerza la renovación. Por ej:

```csharp
var ta = await afip.ElectronicBilling.GetTokenAuthorizationAsync(true);

Console.WriteLine(JsonSerializer.Serialize(ta));
```

{% endtab %}

{% tab title="Java" %}
En cualquier web service podes llamar al método `getTokenAuthorization(true)`. El parámetro `true` fuerza la renovación. Por ej:

```java
GetServiceTAResponse ta = afip.electronicBilling().getTokenAuthorization(true);

System.out.println(ta);
```

{% endtab %}

{% tab title="API" %}
Al pedir la autorización debemos poner el parámetro `force_create: true`

**Endpoint**

<mark style="color:blue;">`POST`</mark> `https://app.afipsdk.com/api/v1/afip/auth`

**Ejemplo**

```json
{
    "environment": "dev",
    "tax_id": "20409378472",
    "wsid": "wsfe",
    "force_create": true
}
```

{% endtab %}
{% endtabs %}


# Preguntas frecuentes

Aquí encontraras las preguntas más frecuentes que se hacen los desarrolladores al utilizar los web services de AFIP.

#### **¿Cuáles son todos los pasos a seguir para emitir una factura electrónica?**

Lo primero es obtener el CAE y Vencimiento del CAE de la factura, una vez obtenido queda crear la factura en algún formato de archivo no modificable, como PDF o imagen, y allí poner el CAE, su vencimiento y el código QR correspondiente.

Lo ultimo es enviar la factura por algún medio electrónico al cliente.

***

#### **¿Cómo se anula una Factura?**

Con una Nota de Crédito con los mismos datos que la factura.

***

#### **¿Por qué los web services del padrón me muestran datos erróneos?**

En testing los web services del padrón muestran datos de prueba, pero no te preocupes en producción te mostrara los datos reales.

***

#### **¿Por qué al consultar datos del padrón devuelve siempre null?**

En modo testing suelen funcionar mal los servidores de AFIP y traer siempre null, pero no te preocupes funciona bien en producción.

***

#### **¿Por qué los comprobantes que género en modo testing no se validan en la página de AFIP?**

El modo testing (Homologación) genera comprobantes de prueba para que puedas comprobar que tu código funciona correctamente. Para crear comprobantes validos deberás pasar al modo producción.

***

#### **¿Debo usar WSFEV1 O WSMTXCA?**

Para la mayoria de los casos debes usar el WSFEV1, el WSMTXCA solo debe se usa cuando AFIP te obliga a hacerlo, sino ni siquiera te habilita el uso.

***

**¿Debo instalar los certificados en el servidor?**

No es necesario realizar una “instalación”, lo único que hay que hacer es copiar los archivos en el proyecto para que la librería los pueda leer.


# Errores frecuentes

Aquí encontraras solución a los errores más frecuentes al utilizar los web services de Afip.

***

#### **Error:** (11002) El punto de venta no se encuentra habilitado a usar el presente WS. Ver metodo FEParamGetPtosVenta

La solución a este error es [crear un punto de venta](/recursos/tutoriales-pagina-de-arca/crear-punto-de-venta) que sea accesible desde web services.

Si ya creaste el punto de venta y el error persiste espera un poco, la creación puede tardar en impactar en todos los sistemas de AFIP.

***

#### Fatal error: Uncaught Exception: SOAP Fault: ns1:coe.alreadyAuthenticated El CEE ya posee un TA valido para el acceso al WSN solicitado

Si estas intentando [forzar la creación de un nuevo Token Authorization](/recursos/otros-metodos-utiles#forzar-la-solicitud-de-un-nuevo-ta) debes esperar 2 minutos entre cada TA en producción, y 10 minutos en desarrollo.

***

#### (10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar

Asegurarse de que en el campo CbteDesde y CbteHasta estas poniendo el número del siguiente comprobante a autorizar.

También aparece este error cuando tratas de enviar un comprobante con una fecha anterior al del último comprobante enviado. Para solucionarlo debes enviarlo con una fecha igual o posterior.

***

#### Certificado no emitido por AC de confianza

Esto sucede porque estamos tratando de utilizar certificados de testing en modo producción o viceversa. Se soluciona cambiando los certificados por el correspondiente o cambiando el modo de la librería (test o producción).

***

#### Warning: openssl\_pkcs7\_sign(): error getting cert

Este error suele aparecer por confundir el certificado con el CRS. Abre el certificado en un editor de texto y asegúrate que la primera línea diga “—–BEGIN CERTIFICATE—–” si hay algo diferente es porque ese no es el certificado.

Este error también suele producirse por un error en el certificado, si no podes solucionarlo con el método anterior entonces genera uno nuevamente siguiendo los pasos de los [Tutoriales página de AFIP](/recursos/tutoriales-pagina-de-arca)

***

#### (600) ValidacionDeToken: Error al verificar hash: VerificacionDeHash: No validó la firma digital.

Este error suele aparecer al cambiar entre modo producción y testing. Si estas usando la API asegurate de no estar pidiendo la autorización en desarrollo y ejecutando la request en producción, sino una posible solución es [forzar la solicitud de un nuevo TA.](/recursos/otros-metodos-utiles#forzar-la-solicitud-de-un-nuevo-ta)

***

#### (600) ValidacionDeToken: No aparecio CUIT en lista de relaciones

Este error aparece cuando intentas usar la librería con un CUIT no vinculado al certificado.

Si estas intentando usar un CUIT de un cliente que te [delego el web service](/recursos/tutoriales-pagina-de-arca/delegar-web-service) aun debes [Aceptar delegación de web service](/recursos/tutoriales-pagina-de-arca/aceptar-delegacion-de-web-service) y luego debes seguir el tutorial [Autorizar web service de producción](/recursos/tutoriales-pagina-de-arca/autorizar-web-service-de-produccion) teniendo en cuenta que en la parte de elegir el «Representado» debes elegir el CUIT de tu cliente.

Si todo esto no lo soluciona quizá necesites [Forzar la solicitud de un nuevo TA](https://docs.afipsdk.com/paso-a-paso/otros-metodos-utiles#forzar-la-solicitud-de-un-nuevo-ta)

***

#### Error 500

Esto aparece porque ocurre algún error en el código pero no está mostrando cual es el error real. Deberías agregar error\_reporting(E\_ALL); ini\_set(“display\_errors”, “1”); en tu código para saber cuál es exactamente el error.

***

#### (501) Error interno de base de datos

Este es un error interno de Afip. La única solución es esperar hasta que lo arreglen.

***

#### SOAP Fault: ns1:coe.notAuthorized Computador no autorizado a acceder al servicio

El problema es que falta autorizar a que se pueda acceder al web service con el certificado en uso. En el tutorial [Autorizar a un web service de testing](/recursos/tutoriales-pagina-de-arca/autorizar-web-service-de-testing) explicamos cómo autorizar en modo testing y en el tutorial [Autorizar a un web service de producción](/recursos/tutoriales-pagina-de-arca/autorizar-web-service-de-produccion) como hacerlo en modo producción.


