B2BB2B LLM

Partner API puntos finales

Complete Partner API ejemplos de solicitud y respuesta para claves, grupos, solicitudes y transacciones.

Partner API puntos finales

URL base:

https://p-api.model-gate.com

Todas las solicitudes requieren:

Authorization: Bearer mg_partner_...
Accept: application/json

Todos los valores monetarios y límite son cadenas decimales JSON. No los analice como números binarios de punto flotante.

Normas comunes de integración bancaria

Todas las marcas de tiempo externas son UTC RFC3339. Uso de puntos finales de recopilación limit (1–100) más un opaco cursor; nunca analice ni fabrique contenidos del cursor. POST, PATCH, y DELETE las solicitudes requieren Idempotency-Key; Vuelva a intentar la misma operación con la misma clave después de los tiempos de espera. Los registros de idempotencia se conservan durante 7 días. Las respuestas incluyen X-Request-ID, son Cache-Control: no-storey todos los errores son JSON. Las respuestas con límite de velocidad son HTTP 429 con Retry-After y X-RateLimit-* encabezados. Se rechazan los campos de consulta/cuerpo desconocidos.

El contrato OpenAPI 3.1 legible por máquina se distribuye como resources/contracts/partner-api.openapi.yaml.

Crear una clave API

Pedido

curl -X POST https://p-api.model-gate.com/api/v1/partner/keys \
  -H "Authorization: Bearer mg_partner_..." \
  -H "Idempotency-Key: operation-unique-001" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Telegram user 123",
    "group_id": "GROUP_PUBLIC_ID",
    "rpm_limit": 30,
    "concurrency_limit": 2,
    "spend_limit": "20.0000000000",
    "usage_price_basis": "official_price",
    "usage_price_multiplier": "0.900000"
  }'

Respuesta - 201

{
  "data": {
    "public_id": "KEY_PUBLIC_ID",
    "group_id": "GROUP_PUBLIC_ID",
    "name": "Telegram user 123",
    "key_prefix": "mg_live_ab12",
    "key": "mg_live_ab12...",
    "status": "active",
    "rpm_limit": 30,
    "concurrency_limit": 2,
    "spend_limit": "20.0000000000",
    "usage": "0.0000000000",
    "total_spent": "0.0000000000",
    "usage_price_basis": "official_price",
    "usage_price_multiplier": "0.900000",
    "effective_usage_price_basis": "official_price",
    "effective_usage_price_multiplier": "0.900000"
  }
}

el completo key El valor se devuelve solo después de la creación o rotación.

Listar claves API

Pedido

curl https://p-api.model-gate.com/api/v1/partner/keys \
  -H "Authorization: Bearer mg_partner_..."

Respuesta: 200

{
  "data": [
    {
      "public_id": "KEY_PUBLIC_ID",
      "group_id": "GROUP_PUBLIC_ID",
      "name": "Telegram user 123",
      "status": "active",
      "spend_limit": "20.0000000000",
      "usage": "3.2500000000",
      "total_spent": "1.1400000000"
    }
  ]
}

La lista se ordena primero como la más nueva y utiliza paginación de cursor opaco. Aprobar limit=1..100; cuando meta.has_more es cierto, envía meta.next_cursor como el siguiente cursor.

Obtenga una clave API

Pedido

curl https://p-api.model-gate.com/api/v1/partner/keys/KEY_PUBLIC_ID \
  -H "Authorization: Bearer mg_partner_..."

Respuesta: 200

{
  "data": {
    "public_id": "KEY_PUBLIC_ID",
    "group_id": "GROUP_PUBLIC_ID",
    "name": "Telegram user 123",
    "status": "active",
    "rpm_limit": 30,
    "concurrency_limit": 2,
    "spend_limit": "20.0000000000",
    "usage": "3.2500000000",
    "total_spent": "1.1400000000",
    "effective_usage_price_basis": "official_price",
    "effective_usage_price_multiplier": "0.900000"
  }
}

Actualizar una clave API

PATCH reemplaza solo los valores mutables admitidos. Para eliminar la clave de un grupo, envíe un mensaje vacío group_id. Para heredar la configuración de valoración, envíe null para la base y el multiplicador a nivel de clave.

Pedido

curl -X PATCH https://p-api.model-gate.com/api/v1/partner/keys/KEY_PUBLIC_ID \
  -H "Authorization: Bearer mg_partner_..." \
  -H "Idempotency-Key: operation-unique-001" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Updated user name",
    "group_id": "GROUP_PUBLIC_ID",
    "rpm_limit": 60,
    "concurrency_limit": 4,
    "spend_limit": "40.0000000000",
    "usage_price_basis": null,
    "usage_price_multiplier": null
  }'

Respuesta: 200

{
  "data": {
    "public_id": "KEY_PUBLIC_ID",
    "spend_limit": "40.0000000000",
    "usage": "3.2500000000",
    "effective_usage_price_basis": "user_price",
    "effective_usage_price_multiplier": "1.000000"
  }
}

Eliminar una clave API

Pedido

curl -X DELETE https://p-api.model-gate.com/api/v1/partner/keys/KEY_PUBLIC_ID \
  -H "Authorization: Bearer mg_partner_..." \
  -H "Idempotency-Key: operation-unique-001" \

Respuesta: 200

{"data":{"deleted":true}}

Congelar y descongelar una clave

Solicitud de congelación

curl -X POST https://p-api.model-gate.com/api/v1/partner/keys/KEY_PUBLIC_ID/freeze \
  -H "Authorization: Bearer mg_partner_..." \
  -H "Idempotency-Key: operation-unique-001" \

Congelar respuesta

{"data":{"public_id":"KEY_PUBLIC_ID","status":"frozen"}}

Solicitud de descongelación

curl -X POST https://p-api.model-gate.com/api/v1/partner/keys/KEY_PUBLIC_ID/unfreeze \
  -H "Authorization: Bearer mg_partner_..." \
  -H "Idempotency-Key: operation-unique-001" \

Descongelar respuesta

{"data":{"public_id":"KEY_PUBLIC_ID","status":"active"}}

La descongelación requiere un correo electrónico del propietario verificado.

Girar una llave

Pedido

curl -X POST https://p-api.model-gate.com/api/v1/partner/keys/KEY_PUBLIC_ID/rotate \
  -H "Authorization: Bearer mg_partner_..." \
  -H "Idempotency-Key: operation-unique-001" \

Respuesta: 200

{
  "data": {
    "public_id": "KEY_PUBLIC_ID",
    "status": "active",
    "key_prefix": "mg_live_cd34",
    "key": "mg_live_cd34..."
  }
}

Restablecer el uso de claves

Pedido

curl -X POST https://p-api.model-gate.com/api/v1/partner/keys/KEY_PUBLIC_ID/reset-usage \
  -H "Authorization: Bearer mg_partner_..." \
  -H "Idempotency-Key: operation-unique-001" \

Respuesta: 200

{
  "data": {
    "public_id": "KEY_PUBLIC_ID",
    "usage": "0.0000000000",
    "total_spent": "1.1400000000"
  }
}

Restablecer el uso no cambia el gasto total ni el saldo de la cuenta.

Obtener uso de claves

Pedido

curl https://p-api.model-gate.com/api/v1/partner/keys/KEY_PUBLIC_ID/usage \
  -H "Authorization: Bearer mg_partner_..."

Respuesta: 200

{
  "data": {
    "key_id": "KEY_PUBLIC_ID",
    "usage": "3.2500000000",
    "total_spent": "1.1400000000"
  }
}

Obtener límite de gasto y uso restante

Pedido

curl https://p-api.model-gate.com/api/v1/partner/keys/KEY_PUBLIC_ID/spent-limit \
  -H "Authorization: Bearer mg_partner_..."

Respuesta: 200

{
  "data": {
    "key_id": "KEY_PUBLIC_ID",
    "spend_limit": "20.0000000000",
    "usage": "3.2500000000",
    "remaining": "16.7500000000"
  }
}

Cuando spend_limit es cero, es ilimitado y remaining es null.

Obtenga las últimas solicitudes de clave

El historial de solicitudes detallado es un conjunto de datos de retención activa controlado por API_REQUESTS_HOT_RETENTION_DAYS (por defecto 7 días). Los metadatos de respuesta informan la ventana de retención activa. Utilice transacciones de saldo para conciliaciones financieras a más largo plazo.

limit es opcional, el valor predeterminado es 10 y debe ser un número entero de 1 a 100. Las solicitudes finalizadas se ordenan por finished_at lo más nuevo primero. Cuando meta.has_more es true, aprobar meta.next_cursor como el opaco before parámetro de consulta para recuperar la siguiente página anterior. No analice ni construya cursores usted mismo.

La respuesta contiene tasas inmutables de usuario y oficiales por millón de tokens para solicitudes completadas después de la migración. 059_request_pricing_audit_snapshot.sql. También calcula pricing_snapshot.usage_price desde la base guardada, el multiplicador y las tasas históricas sin almacenar otro conjunto de tasas. Esto hace que la valoración independiente del límite de uso sea auditable después de que cambian los precios del catálogo. Solicitudes históricas creadas antes del regreso de la migración 059 pricing_snapshot.available: false en lugar de sustituir los precios actuales. Las solicitudes ejecutadas a través de API por lotes compatibles con Claude/OpenAI están marcadas explícitamente con request_mode: "batch" e incluir su protocolo, ID del trabajo por lotes, custom_idy el multiplicador de precios por lotes de Model Gate capturado.

Latencia utiliza nombres estables de negocios/socios: gateway_overhead_ms, upstream_first_token_ms, y e2e_first_token_ms. El valor del primer token E2E se mide desde el inicio de la solicitud de Model Gate hasta el primer token de contenido real y excluye el tiempo TLS/red del lado del cliente. El Partner API expone sólo lo explícito e2e_first_token_ms nombre; la columna de almacenamiento interno permanece api_requests.first_token_ms.

Pedido

curl "https://p-api.model-gate.com/api/v1/partner/keys/KEY_PUBLIC_ID/requests?limit=10" \
  -H "Authorization: Bearer mg_partner_..."

Respuesta: 200

{
  "data": [
    {
      "request_id": "01KZ...",
      "key_id": "KEY_PUBLIC_ID",
      "group_id": "GROUP_PUBLIC_ID",
      "model": "claude-opus-4.7",
      "endpoint": "messages",
      "method": "POST",
      "status": "succeeded",
      "status_code": 200,
      "is_stream": false,
      "request_mode": "batch",
      "batch": {
        "protocol": "claude",
        "job_id": "msgbatch_01K...",
        "custom_id": "request-1",
        "price_multiplier": "0.5"
      },
      "tokens": {
        "input": 120,
        "output": 45,
        "cached": 0,
        "cache_write": 0,
        "reasoning": 0,
        "total": 165
      },
      "cost": "0.0000345",
      "usage_cost": "0.00345",
      "official_base_cost": "0.000345",
      "currency": "USD",
      "usage_pricing": {
        "basis": "official_price",
        "base_field": "official_base_cost",
        "base_amount": "0.000345",
        "multiplier": "10",
        "usage_cost": "0.00345",
        "formula": "round(base_amount * multiplier, 10)"
      },
      "pricing_snapshot": {
        "available": true,
        "unit": "per_1m_tokens",
        "user_price": {
          "input": "0.2",
          "output": "1",
          "cache_read": "0.02",
          "cache_write": "0.25",
          "reasoning": "1"
        },
        "official_price": {
          "input": "1",
          "output": "5",
          "cache_read": "0.1",
          "cache_write": "1.25",
          "reasoning": "5"
        },
        "usage_price": {
          "input": "10",
          "output": "50",
          "cache_read": "1",
          "cache_write": "12.5",
          "reasoning": "50"
        }
      },
      "duration_ms": 842,
      "gateway_overhead_ms": 34,
      "upstream_first_token_ms": 156,
      "e2e_first_token_ms": 190,
      "settlement_status": "settled",
      "started_at": "2026-08-05T10:00:00Z",
      "finished_at": "2026-08-05T10:00:00.842Z"
    }
  ],
  "meta": {
    "key_id": "KEY_PUBLIC_ID",
    "limit": 10,
    "returned": 1,
    "order": "finished_at_desc",
    "next_cursor": "eyJ0IjoiMjAyNi0wOC0wNSAxMDowMDowMCIsInAiOiIwMUt...",
    "has_more": true
  }
}

Para continuar con la siguiente página anterior:

curl "https://p-api.model-gate.com/api/v1/partner/keys/KEY_PUBLIC_ID/requests?limit=10&before=NEXT_CURSOR" \
  -H "Authorization: Bearer mg_partner_..."

un inválido before el cursor devuelve HTTP 422. El cursor contiene sólo la posición de la hora de finalización y el ID público de la solicitud externa; Los ID de solicitud numéricos internos nunca se exponen.

Para solicitudes síncronas y asíncronas nativas, request_mode es sync o async y el batch Se omite el objeto. La instantánea guardada de la tasa de token permite que el cálculo base histórico se reproduzca como sum(tokens × snapshotted_rate / 1,000,000). La liquidación redondea el importe base seleccionado a 10 decimales y luego calcula round(base_amount × multiplier, 10). el almacenado cost, official_base_cost, y usage_cost Los campos siguen siendo autorizados.

Este punto final nunca devuelve los cuerpos de solicitud y respuesta sin procesar.

Listar transacciones de saldo

Pedido

curl https://p-api.model-gate.com/api/v1/partner/transactions \
  -H "Authorization: Bearer mg_partner_..."

Respuesta: 200

{
  "data": [
    {
      "transaction_id": "TRANSACTION_PUBLIC_ID",
      "type": "debit",
      "source": "api_usage_minute",
      "billing_minute_num": 29769120,
      "amount": "-0.0232000000",
      "request_count": 100,
      "balance_before": null,
      "balance_after": null,
      "api_key_id": null,
      "created_at": "2026-08-05T10:00:00Z"
    }
  ]
}

La inferencia facturable se representa como una fila del libro mayor de billetera por propietario de facturación y minuto de finalización. transaction_id es el identificador duradero del libro mayor público. request_count es el número de solicitudes incluidas en ese minuto de débito; billing_minute_num es floor(unix(finished_at)/60). Libro mayor interno sin procesar id / source_id los valores no se devuelven. Las filas agregadas de uso de API se devuelven intencionalmente null para balance_before, balance_after, y api_key_id; Los detalles exactos de clave/grupo/solicitud permanecen disponibles en el historial de solicitudes y en el desglose de las actas del panel.

Obtener saldo actual

curl https://p-api.model-gate.com/api/v1/partner/balance \
  -H "Authorization: Bearer mg_partner_..."
{"data":{"balance":"1234.5678900000","currency":"USD","as_of":"2026-08-28T07:00:00Z"}}

Utilice este punto final después account.balance_low devoluciones de llamada para conciliar la billetera de la cuenta actual sin requerir una credencial de API modelo.

Listar eventos de auditoría de socios

curl "https://p-api.model-gate.com/api/v1/partner/audit-events?limit=100" \
  -H "Authorization: Bearer mg_partner_..."

Los eventos de auditoría registran las mutaciones exitosas en la administración de socios con ID de solicitud, acción, destino, IP de origen, estado, metadatos seguros y marca de tiempo UTC. Los secretos, los tokens de portador, el texto sin formato de clave API, las claves de idempotencia, las huellas digitales de solicitud y los cuerpos de reproducción no se almacenan en los metadatos de auditoría. Usar cursor para páginas siguientes y opcional action filtración.

Crear un grupo

Pedido

curl -X POST https://p-api.model-gate.com/api/v1/partner/groups \
  -H "Authorization: Bearer mg_partner_..." \
  -H "Idempotency-Key: operation-unique-001" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Telegram bot A",
    "description": "Keys created by bot A",
    "rpm_limit": 100,
    "concurrency_limit": 20,
    "spend_limit": "1000.0000000000",
    "usage_price_basis": "official_price",
    "usage_price_multiplier": "0.900000"
  }'

Respuesta - 201

{
  "data": {
    "public_id": "GROUP_PUBLIC_ID",
    "name": "Telegram bot A",
    "status": "active",
    "spend_limit": "1000.0000000000",
    "usage": "0.0000000000",
    "total_spent": "0.0000000000",
    "usage_price_basis": "official_price",
    "usage_price_multiplier": "0.900000"
  }
}

Listar grupos

Pedido

curl https://p-api.model-gate.com/api/v1/partner/groups \
  -H "Authorization: Bearer mg_partner_..."

Respuesta

{"data":[{"public_id":"GROUP_PUBLIC_ID","name":"Telegram bot A","status":"active","usage":"0.0000000000"}]}

Obtener o actualizar un grupo

Obtener solicitud

curl https://p-api.model-gate.com/api/v1/partner/groups/GROUP_PUBLIC_ID \
  -H "Authorization: Bearer mg_partner_..."

Obtener respuesta

{"data":{"public_id":"GROUP_PUBLIC_ID","name":"Telegram bot A","spend_limit":"1000.0000000000","usage":"12.0000000000"}}

Solicitud de actualización

curl -X PATCH https://p-api.model-gate.com/api/v1/partner/groups/GROUP_PUBLIC_ID \
  -H "Authorization: Bearer mg_partner_..." \
  -H "Idempotency-Key: operation-unique-001" \
  -H "Content-Type: application/json" \
  -d '{"name":"Telegram bot A production","status":"active","spend_limit":"2000.0000000000","usage_price_basis":"user_price","usage_price_multiplier":"1.200000"}'

Actualizar respuesta

{"data":{"public_id":"GROUP_PUBLIC_ID","name":"Telegram bot A production","spend_limit":"2000.0000000000","usage_price_basis":"user_price","usage_price_multiplier":"1.200000"}}

Eliminar un grupo

Un grupo que no esté vacío no se elimina. Mueva o elimine todas las claves API de los miembros primero; de lo contrario, la API devuelve HTTP 409 con group_not_empty.

Pedido

curl -X DELETE https://p-api.model-gate.com/api/v1/partner/groups/GROUP_PUBLIC_ID \
  -H "Authorization: Bearer mg_partner_..." \
  -H "Idempotency-Key: operation-unique-001" \

Respuesta

{"data":{"deleted":true}}

Las claves se separan según el comportamiento de la clave externa de la base de datos. Verifique la membresía antes de la eliminación.

Restablecer el uso del grupo

Pedido

curl -X POST https://p-api.model-gate.com/api/v1/partner/groups/GROUP_PUBLIC_ID/reset-usage \
  -H "Authorization: Bearer mg_partner_..." \
  -H "Idempotency-Key: operation-unique-001" \

Respuesta

{"data":{"public_id":"GROUP_PUBLIC_ID","usage":"0.0000000000","total_spent":"8.5000000000"}}

Listar miembros del grupo

Pedido

curl https://p-api.model-gate.com/api/v1/partner/groups/GROUP_PUBLIC_ID/members \
  -H "Authorization: Bearer mg_partner_..."

Respuesta

{"data":[{"public_id":"KEY_PUBLIC_ID","name":"Telegram user 123","status":"active","usage":"3.2500000000","total_spent":"1.1400000000"}]}

Agregar una clave a un grupo

Pedido

curl -X POST https://p-api.model-gate.com/api/v1/partner/groups/GROUP_PUBLIC_ID/members \
  -H "Authorization: Bearer mg_partner_..." \
  -H "Idempotency-Key: operation-unique-001" \
  -H "Content-Type: application/json" \
  -d '{"key_id":"KEY_PUBLIC_ID"}'

Respuesta

La respuesta es la lista actualizada de miembros del grupo:

{"data":[{"public_id":"KEY_PUBLIC_ID","name":"Telegram user 123","status":"active"}]}

Eliminar una clave de un grupo

Pedido

curl -X DELETE https://p-api.model-gate.com/api/v1/partner/groups/GROUP_PUBLIC_ID/members/KEY_PUBLIC_ID \
  -H "Authorization: Bearer mg_partner_..." \
  -H "Idempotency-Key: operation-unique-001" \

Respuesta

{"data":{"removed":true}}

Obtener uso grupal

Pedido

curl https://p-api.model-gate.com/api/v1/partner/groups/GROUP_PUBLIC_ID/usage \
  -H "Authorization: Bearer mg_partner_..."

Respuesta

{"data":{"group_id":"GROUP_PUBLIC_ID","usage":"12.0000000000","total_spent":"8.5000000000","usage_reset_at":"2026-08-01T00:00:00Z"}}

Obtener estadísticas del grupo

from y to aceptar sólo marcas de tiempo UTC RFC3339 que terminen en Z (Se permiten fracciones de segundo de hasta 6 dígitos). Las estadísticas se calculan únicamente a partir de agregados de solicitudes completadas codificados por finished_at; el minuto actualmente abierto se excluye intencionalmente, por lo que los resultados pueden retrasarse hasta la cadencia de agregación de minutos.

average_duration_ms es la duración promedio completa de la solicitud de Model Gate (duration_ms) entre las solicitudes completadas en el período seleccionado. No se trata de latencia del primer token E2E, latencia del primer token ascendente ni sobrecarga de la puerta de enlace. El Partner API expone solo este nombre de métrica explícito.

Pedido

curl "https://p-api.model-gate.com/api/v1/partner/groups/GROUP_PUBLIC_ID/stats?from=2026-08-01T00:00:00Z&to=2026-08-05T23:59:59Z" \
  -H "Authorization: Bearer mg_partner_..."

Respuesta

{
  "data": {
    "group_id": "GROUP_PUBLIC_ID",
    "requests": 120,
    "errors": 3,
    "input_tokens": 50000,
    "output_tokens": 12000,
    "cached_tokens": 8000,
    "cache_write_tokens": 1200,
    "reasoning_tokens": 2000,
    "cost": "8.5000000000",
    "average_duration_ms": "842.50",
    "from": "2026-08-01T00:00:00Z",
    "to": "2026-08-05T23:59:59Z"
  }
}

Obtener un resultado asincrónico

Pedido

curl https://p-api.model-gate.com/api/v1/requests/01KZ... \
  -H "Authorization: Bearer mg_partner_..."

Respuesta de procesamiento

{
  "data": {
    "request_id": "01KZ...",
    "status": "processing",
    "created_at": "2026-08-05T10:00:00Z",
    "started_at": "2026-08-05T10:00:00Z",
    "completed_at": null,
    "expires_at": "2026-08-06T10:00:00Z"
  }
}

Respuesta completa

{
  "data": {
    "request_id": "01KZ...",
    "status": "completed",
    "response_status": 200,
    "response_headers": {"Content-Type":"application/json"},
    "response": {"id":"resp_example","status":"completed"},
    "completed_at": "2026-08-05T10:00:05Z",
    "expires_at": "2026-08-06T10:00:00Z"
  }
}

Errores comunes

Clave Partner API no válida: 401

{"error":{"type":"invalid_token","message":"Invalid Partner API key"}}

Recurso no encontrado — 404

{"error":{"type":"not_found","message":"API key not found"}}

Solicitud no válida — 422

{"error":{"type":"invalid_request","message":"limit must be an integer from 1 to 100"}}

Los cuerpos JSON Partner API mutantes están limitados a 1 MiB.

Conflicto de idempotencia — 409

Lo mismo Idempotency-Key fue reutilizado para una solicitud diferente. Genere una nueva clave para una nueva operación lógica.

Límite de tasa: 429

La respuesta contiene error.code = partner_rate_limit_exceeded y Retry-After. Vuelva a intentarlo sólo después del retraso indicado.

Método no permitido — 405

El host del socio devuelve un error JSON más el HTTP Allow encabezamiento; nunca vuelve a una página de error HTML.

Reglas principales de credenciales comerciales

Para un token de Empresa Partner API, solo se acepta el propietario de la organización verificada. Las claves creadas a través de Partner API utilizan a ese propietario como propietario de facturación y principal de credenciales. La asignación empleado-principal se realiza en el panel web. group_id, cuando se proporciona, debe identificar un grupo activo propiedad de la cuenta comercial; los valores no válidos devuelven HTTP 422 y nunca recurrir a una clave desagrupada. Las respuestas del historial de solicitudes pueden incluir principal_user_id para identificar el principal de la credencial independientemente de la propiedad de facturación.