TEKIO REST API

Integra facturación electrónica DIAN en tus sistemas externos con autenticación por tokens.

Versión
v1
Formato
JSON
Encoding
UTF-8
Auth
Bearer Token
Access token TTL
1 hora
Refresh token TTL
30 días

Base URL

https://pos.tekio.com.co/v1

Todos los endpoints usan este prefijo.

Autenticación

  1. Genera tus credenciales en Configuración → API. Obtienes un client_id y un client_secret.
  2. Haz POST /v1/auth/token con esas credenciales. Recibirás un access token (1h) y un refresh token (30 días).
  3. Incluye el access token en cada petición: Authorization: Bearer <access_token>
  4. Cuando expire, usa POST /v1/auth/refresh para obtener un nuevo par.
El client_secret se muestra una sola vez al generarlo. Guárdalo en un lugar seguro.

Obtener tokens

POST /v1/auth/token No requiere autenticación previa

Autentica con tus credenciales y obtén un par access + refresh token.

Parámetros (JSON)

CampoTipoDescripción
client_idstringrequeridoUUID del cliente API
client_secretstringrequeridoSecreto generado al crear las credenciales

Ejemplo

curl -X POST https://pos.tekio.com.co/v1/auth/token \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "client_secret": "abc123...secreto"
  }'

Respuesta 200

{
  "access_token": "4f8a2b...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "9e1c7f...",
  "refresh_token_expires_in": 2592000
}

Refrescar access token

POST /v1/auth/refresh No requiere autenticación previa

Obtén un nuevo par de tokens. El refresh token anterior queda invalidado.

Parámetros (JSON)

CampoTipoDescripción
refresh_tokenstringrequeridoRefresh token activo y no expirado

Ejemplo

curl -X POST https://pos.tekio.com.co/v1/auth/refresh \
  -H "Content-Type: application/json" \
  -d '{"refresh_token": "9e1c7f..."}'

Respuesta 200

{
  "access_token": "nuevo_token...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "nuevo_refresh...",
  "refresh_token_expires_in": 2592000
}

Crear factura electrónica DIAN

POST /v1/invoices Requiere Bearer token

Registra una venta y emite la factura electrónica a la DIAN en un solo paso.

Headers requeridos

Authorization: Bearer <access_token>
Content-Type: application/json

El cliente y los productos se crean automáticamente si no existen en el sistema.

Parámetros (JSON)

CampoTipoDescripción
customerobjectrequeridoDatos del cliente — ver esquema abajo
itemsarrayrequeridoLíneas de detalle — ver esquema de ítems
payment_formstringopcional1 contado (por defecto) · 2 crédito — ver catálogo
payment_method_codestringopcional10 efectivo · 20 tarjeta · 42 transferencia. Por defecto 10ver catálogo
payment_due_datestringopcionalFecha vencimiento YYYY-MM-DD (solo si payment_form=2)
observationstringopcionalObservaciones de la factura
cost_center_idintegeropcionalID del centro de costo

Esquema de customer

CampoDescripción
identificationrequeridoNIT o cédula (sin DV)
dvopcionalDígito de verificación
companyopcionalRazón social
namesopcionalNombre completo (personas naturales)
emailopcionalCorreo electrónico
phoneopcionalTeléfono
addressopcionalDirección
identification_document_idopcional13 cédula · 31 NIT · 41 pasaporte — ver catálogo
legal_organization_idopcional1 persona jurídica · 2 persona natural — ver catálogo
tribute_idopcionalResponsabilidad fiscal DIAN (ej: 21=No responsable IVA) — ver catálogo
municipality_idopcionalCódigo municipio DANE (ej: 11001=Bogotá) — ver catálogo

Ejemplo completo

curl -X POST https://pos.tekio.com.co/v1/invoices \
  -H "Authorization: Bearer 4f8a2b..." \
  -H "Content-Type: application/json" \
  -d '{
    "payment_form": "1",
    "payment_method_code": "10",
    "observation": "Pedido web #1024",
    "customer": {
      "identification": "901354671",
      "dv": "1",
      "company": "NEXO CONTABLE SAS",
      "email": "contacto@nexo.com",
      "phone": "3175751320",
      "address": "CALLE 60 B SUR 44 100",
      "identification_document_id": "31",
      "legal_organization_id": "1",
      "tribute_id": "21",
      "municipality_id": "05631"
    },
    "items": [
      {
        "code_reference": "1041",
        "name": "SERVICIO EN LA NUBE",
        "quantity": 1,
        "price": 500000,
        "tax_rate": "19.00",
        "discount_rate": 0,
        "unit_measure_id": 70,
        "withholding_taxes": [
          {"code": "06", "withholding_tax_rate": "15.00"}
        ]
      },
      {
        "code_reference": "1043",
        "name": "CAMISETA DE DOTACION",
        "quantity": 3,
        "price": 20000,
        "tax_rate": "0.00",
        "discount_rate": 0
      }
    ]
  }'

Respuesta 201 — Factura emitida

{
  "sale_id": 301,
  "customer_id": 42,
  "total": 619000.00,
  "numero_completo": "SETP990000001",
  "cufe": "abc123...",
  "items_created": 1,
  "dian": {
    "success": true,
    "cufe": "abc123...",
    "numero_completo": "SETP990000001",
    "message": "Documento procesado correctamente",
    "status_code": "00"
  }
}

items_created: número de productos que fueron creados automáticamente en el catálogo.

Respuesta 207 — Venta guardada, error DIAN

{
  "sale_id": 302,
  "customer_id": 42,
  "total": 619000.00,
  "items_created": 0,
  "dian": { "success": false, "message": "Error al conectar con la DIAN" }
}

Crear nota crédito DIAN

POST /v1/credit-notes Requiere Bearer token

Emite una nota crédito electrónica para una factura ya emitida a la DIAN.

Headers requeridos

Authorization: Bearer <access_token>
Content-Type: application/json

Parámetros (JSON)

CampoTipoDescripción
sale_idintegerrequeridoID de la venta con factura DIAN emitida
correction_concept_idintegeropcional1 Devolución · 2 Anulación (por defecto) · 3 Rebaja · 4 Ajuste
descriptionstringopcionalMotivo. Si se omite usa el texto por defecto del concepto

Ejemplo

curl -X POST https://pos.tekio.com.co/v1/credit-notes \
  -H "Authorization: Bearer 4f8a2b..." \
  -H "Content-Type: application/json" \
  -d '{
    "sale_id": 301,
    "correction_concept_id": 2,
    "description": "Error en el precio unitario"
  }'

Respuesta 201

{
  "success": true,
  "cufe": "xyz987...",
  "numero_completo": "NC990000001",
  "message": "Nota crédito emitida correctamente"
}

Catálogo — Formas de pago

GET /v1/catalogs/payment-forms No requiere autenticación

Respuesta

{
  "data": [
    { "id": "1", "name": "Contado" },
    { "id": "2", "name": "Crédito" }
  ]
}

Catálogo — Métodos de pago

GET /v1/catalogs/payment-methods No requiere autenticación

Respuesta

{
  "data": [
    { "code": "10",  "name": "Efectivo" },
    { "code": "20",  "name": "Cheque" },
    { "code": "42",  "name": "Consignación / Transferencia bancaria" },
    { "code": "47",  "name": "Transferencia débito bancario" },
    { "code": "48",  "name": "Tarjeta de crédito" },
    { "code": "49",  "name": "Tarjeta débito" },
    { "code": "1",   "name": "Instrumento no definido" },
    { "code": "ZZZ", "name": "Otro" }
  ]
}

Catálogo — Tipos de documento de identificación

GET /v1/catalogs/identification-documents No requiere autenticación

Respuesta

{
  "data": [
    { "id": "11", "name": "Registro civil" },
    { "id": "12", "name": "Tarjeta de identidad" },
    { "id": "13", "name": "Cédula de ciudadanía" },
    { "id": "21", "name": "Tarjeta de extranjería" },
    { "id": "22", "name": "Cédula de extranjería" },
    { "id": "31", "name": "NIT" },
    { "id": "41", "name": "Pasaporte" },
    { "id": "42", "name": "Documento de identificación extranjero" },
    { "id": "50", "name": "NIT de otro país" },
    { "id": "91", "name": "NUIP" }
  ]
}

Catálogo — Responsabilidades fiscales (tribute_id)

GET /v1/catalogs/tributes No requiere autenticación

Respuesta

{
  "data": [
    { "id": "01", "name": "IVA — Impuesto sobre las ventas" },
    { "id": "04", "name": "INC — Impuesto nacional al consumo" },
    { "id": "07", "name": "Retención en la fuente a título de renta" },
    { "id": "09", "name": "Retención en la fuente en IVA" },
    { "id": "11", "name": "Retención en la fuente en ICA" },
    { "id": "12", "name": "ICA — Impuesto de industria y comercio" },
    { "id": "21", "name": "No responsable de IVA (régimen simplificado)" },
    { "id": "22", "name": "Régimen simple de tributación — SIMPLE" },
    { "id": "23", "name": "Gran contribuyente" },
    { "id": "24", "name": "Autorretenedor" },
    { "id": "ZZ", "name": "No aplica" }
  ]
}

Catálogo — Tarifas de IVA

GET /v1/catalogs/tax-rates No requiere autenticación

Respuesta

{
  "data": [
    { "rate": "0.00",  "name": "Excluido / Exento de IVA",   "tribute_id": "1" },
    { "rate": "5.00",  "name": "IVA 5%",                     "tribute_id": "1" },
    { "rate": "19.00", "name": "IVA 19% (tarifa general)",   "tribute_id": "1" },
    { "rate": "8.00",  "name": "INC 8% (bebidas azucaradas)","tribute_id": "4" }
  ]
}

Catálogo — Retenciones (withholding_taxes)

GET /v1/catalogs/withholding-taxes No requiere autenticación

Respuesta

{
  "data": [
    {
      "code": "01",
      "name": "ReteFuente — Retención en la fuente a título de renta",
      "base": "valor_neto_linea",
      "common_rates": ["1.50","2.50","3.50","4.00","6.00","11.00"]
    },
    {
      "code": "04",
      "name": "ReteICA — Retención de industria y comercio",
      "base": "valor_neto_linea",
      "common_rates": ["0.414","0.483","0.552","0.966","1.104"]
    },
    {
      "code": "06",
      "name": "ReteIVA — Retención del impuesto sobre las ventas",
      "base": "valor_iva_linea",
      "common_rates": ["15.00"]
    }
  ]
}

base indica sobre qué valor se calcula la retención: el valor neto de la línea o el valor de IVA de la línea.

Catálogo — Municipios

GET /v1/catalogs/municipalities No requiere autenticación

Query params

ParámetroDescripción
searchopcionalFiltra por nombre de municipio (ej: ?search=bogota)
departmentopcionalFiltra por código de departamento DANE (ej: ?department=11)
limitopcionalMáximo resultados. Por defecto 50, máximo 200

Ejemplo

GET https://pos.tekio.com.co/v1/catalogs/municipalities?search=bogota

Respuesta

{
  "total": 1,
  "data": [
    { "id": "11001", "name": "Bogota D.C.", "department": "Bogota D.C." }
  ],
  "note": "Usa ?search=nombre para filtrar. ?department=codigo para filtrar por departamento."
}

Esquema de ítems

CampoTipoDescripción
product_idintegerrequeridoID del producto en TEKIO
quantitynumberrequeridoCantidad
unit_pricenumberrequeridoPrecio unitario antes de impuestos
tax_ratenumberopcionalIVA en % (ej: 19, 5, 0). Por defecto 0ver catálogo
discount_ratenumberopcionalDescuento en % sobre precio bruto. Por defecto 0
applies_retefuente0 | 1opcionalAplica ReteFuente
retefuente_ratenumberopcionalTasa ReteFuente en %
applies_reteiva0 | 1opcionalAplica ReteIVA
reteiva_ratenumberopcionalTasa ReteIVA en %
applies_reteica0 | 1opcionalAplica ReteICA
reteica_ratenumberopcionalTasa ReteICA en ‰

Fórmula por línea

line_gross = quantity × unit_price
line_disc  = line_gross × (discount_rate / 100)
line_net   = line_gross − line_disc
line_tax   = line_net × (tax_rate / 100)
line_total = line_net + line_tax

Códigos de respuesta

CódigoSignificado
200OK — solicitud exitosa
201Created — recurso creado
207Multi-Status — venta guardada, error DIAN
400Bad Request — campos faltantes o inválidos
401Unauthorized — token inválido o expirado
404Not Found — recurso no encontrado
422Unprocessable Entity — validación fallida
500Internal Server Error

Todos los errores retornan: { "error": "Mensaje descriptivo" }