Skip to main content
Glama
tokportal

tokportal-mcp

Official
by tokportal

tokportal

PyPI Python license

TokPortal es la API de infraestructura social gestionada: cuentas reales de TikTok, Instagram y YouTube creadas, calentadas y operadas por gestores de cuentas humanos en más de 16 países, expuestas como una API REST y un servidor MCP. Sin OAuth por cuenta, sin límite de 25 publicaciones al día, sin revisión de aplicación.

Documentación https://developers.tokportal.com · Base de la API https://app.tokportal.com/api/ext · OpenAPI https://developers.tokportal.com/openapi.json · MCP remoto https://app.tokportal.com/api/ext/mcp · Obtén una clave API https://app.tokportal.com/developer/api-keys · llms.txt https://developers.tokportal.com/llms.txt


tokportal es el SDK oficial de Python para la API de TokPortal (Python 3.9+, tipado, solo biblioteca estándar). Cada operación pública está disponible como un método de recurso o a través del mapa generado request_operation.

Instalación

pip install tokportal

Related MCP server: tiktok-mcp

Inicio rápido en 30 segundos

import os
from tokportal import TokPortal

client = TokPortal(api_key=os.environ["TOKPORTAL_API_KEY"])

# 1. Create a bundle: a fresh managed TikTok account in the USA + 1 video slot.
#    Credits are debited now; the account manager is assigned at publish time.
bundle = client.bundles.create({
    "bundle_type": "account_and_videos",
    "platform": "tiktok",
    "country": "USA",
    "title": "US launch",
    "videos_quantity": 1,
})
bundle_id = bundle["data"]["id"]

# 2. Upload the video straight from disk -> public_url
upload = client.uploads.video_direct("./launch.mp4", bundle_id, content_type="video/mp4")

# 3. Configure the account profile and video slot 1, then publish
client.bundles.configure_account(bundle_id, {
    "username": "mybrand.us",
    "visible_name": "My Brand",
    "biography": "Official account",
})
client.bundles.configure_video(bundle_id, 1, {
    "video_type": "video",
    "video_url": upload["data"]["public_url"],
    "description": "Day 1 - launching in the US #launch",
    "target_publish_date": "2026-09-01",
})
client.bundles.publish(bundle_id)

# 4. Later (webhook `account.in_review` / `account.finalized`, or polling):
#    saved_account_id is the real delivered account -> read it back
current = client.bundles.get(bundle_id)["data"]
if current.get("saved_account_id"):
    account = client.accounts.get(current["saved_account_id"])["data"]
    print(account["username"], account["profile_url"])

Los nombres de los métodos siguen el mapa de recursos generado (bundles, uploads, accounts, analytics, webhooks). Si no existe un helper para una operación, usa client.request_operation("<operationId>", path=..., query=..., body=...).

Ejemplo completo

import os
from tokportal import TokPortal, TokPortalApiError

client = TokPortal(api_key=os.environ["TOKPORTAL_API_KEY"])

me = client.me()

bundle = client.bundles.create({
    "bundle_type": "account_and_videos",
    "country": "USA",
    "videos_quantity": 5,
})

csv = client.analytics.export_videos(account=["saved-account-id"])
image = client.uploads.image_from_url({
    "url": "https://cdn.example.com/photo.jpg",
    "bundle_id": bundle["data"]["id"],
})

print(me["data"]["email"], bundle["data"], csv, image["data"])

Las subidas directas multipart usan los mismos errores estructurados y soporte de idempotencia:

uploaded = client.uploads.video_direct(
    "./video.mp4",
    bundle["data"]["id"],
    content_type="video/mp4",
    idempotency_key="video-upload-123",
)

Gestiona la cobertura de TokPortal desde la cotización atómica más reciente. Una cotización con cero créditos es válida y aún requiere una llamada explícita de reactivación:

coverage = client.accounts.coverage("saved-account-id")
quote = coverage["data"]["reactivation_quote"]

if quote:
    client.accounts.reactivate_coverage(
        "saved-account-id",
        {
            "expected_credits": quote["credits"],
            "expected_current_period_end": quote["current_period_end"],
            "expected_lock_version": quote["lock_version"],
        },
        idempotency_key="coverage-reactivate-saved-account-id-v4",
    )

client.accounts.pause_coverage(
    "saved-account-id",
    idempotency_key="coverage-pause-saved-account-id-v4",
)

La revelación de credenciales y el acceso al código de verificación usan el mismo flujo de política de dos pasos irreversible. La primera llamada sin aceptación devuelve HTTP 428 y error.details.policy_version; luego muestra esos términos al propietario de la cuenta y reintenta con esa versión exacta. La solicitud aceptada puede debitar créditos y desvincular permanentemente la cuenta. Estas respuestas que contienen secretos nunca se almacenan para reproducción, por lo que estos helpers intencionalmente no aceptan idempotency_key. Después de un resultado de transporte incierto, reconcilia el estado seguro de la cuenta antes de decidir si llamar al endpoint nuevamente sin una clave:

Si una llamada aceptada devuelve HTTP 409 con CREDENTIAL_REVEAL_QUOTE_CHANGED, no se produjo ningún cargo ni revelación. Lee la política actual y expected_credit_cost de error.details, muestra los nuevos términos al propietario, obtén un nuevo consentimiento y reintenta con la nueva versión. Nunca reintentes un 409 automáticamente.

try:
    client.accounts.reveal_credentials("saved-account-id")
except TokPortalApiError as error:
    if error.status_code != 428:
        raise

    policy_version = str(error.details["policy_version"])
    credentials = client.accounts.reveal_credentials(
        "saved-account-id",
        acceptance={
            "acknowledge_support_forfeit": True,
            "policy_version": policy_version,
        },
    )

La misma regla de no reproducción se aplica a webhooks.create, uploads.image, uploads.video y analytics.create_report porque devuelven un secreto de firma, capacidad de subida firmada o token de acceso al informe. Estos helpers no aceptan idempotency_key, y request_operation rechaza una localmente para los seis ID de operación sensibles.

Descubre y opera webhooks sin recurrir a HTTP puro:

catalog = client.webhooks.events()
endpoints = client.webhooks.list(event="bundle.published")
retry = client.webhooks.retry_delivery(endpoints["data"][0]["id"], "delivery-id")

Cada operación de OpenAPI también es accesible a través del mapa de operaciones generado:

same_retry = client.request_operation(
    "retryWebhookDelivery",
    path={"id": endpoints["data"][0]["id"], "delivery_id": "delivery-id"},
)

csv_again = client.request_operation(
    "exportAnalyticsVideos",
    query={"account": ["saved-account-id"]},
)

El SDK envía X-TokPortal-Client: tokportal-python/0.1.0 en las solicitudes a la API para observabilidad y diagnóstico de soporte.

Verifica las entregas de webhooks firmadas con el cuerpo exacto de la solicitud sin procesar:

from tokportal import verify_webhook_signature

valid = verify_webhook_signature(
    raw_body,
    request.headers["TokPortal-Signature"],
    os.environ["TOKPORTAL_WEBHOOK_SECRET"],
)
from tokportal import TokPortalApiError

try:
    client.bundles.create({
        "bundle_type": "account_and_videos",
        "country": "USA",
        "videos_quantity": 5,
    })
except TokPortalApiError as error:
    print(error.status_code, error.code, error.details, error.request_id)
    if error.retryable:
        wait_seconds = error.retry_after_seconds or 1
        # Retry with backoff.
        pass
    print(error.rate_limit)

Las claves API usan el formato sk_ seguido de 64 caracteres hexadecimales en minúsculas. TokPortal almacena solo un hash SHA-256 de la clave y muestra la clave sin procesar una vez en la creación.

Fuente de verdad

Este paquete se genera a partir del esquema OpenAPI público de TokPortal (https://developers.tokportal.com/openapi.json) en el monorepositorio privado de TokPortal. Los archivos generados (tokportal/_generated.py) se sobrescriben en cada versión; no los edites manualmente. Consulta CONTRIBUTING.md para lo que aceptamos como PRs y SECURITY.md para informar vulnerabilidades.

Enlaces

MIT © TokPortal

Install Server
A
license - permissive license
B
quality
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    B
    quality
    -
    maintenance
    A comprehensive MCP server that enables AI assistants to search, download, and analyze TikTok content while also performing active tasks like publishing videos and interacting with posts. It provides full automation capabilities for TikTok through browser session management and anti-detection features.
    12
    2
  • F
    license
    B
    quality
    C
    maintenance
    MCP server for TikTok that enables searching videos, users, hashtags, and fetching trending content, user profiles, and video details via official API or public scraping.
    8
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for TikTok that publishes videos to your own TikTok account and retrieves video performance metrics through TikTok's official Content Posting and Display APIs.
    6
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    MCP server for TikTok that lets AI agents connect accounts, post and schedule videos, follow users, manage profiles, and analyze performance—all via QR login with no API keys.
    16
    1
    MIT

View all related MCP servers

Related MCP Connectors

  • Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.

  • MCP server for Wan AI video generation

  • MCP server for ByteDance Seedance AI video generation

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/tokportal/tokportal-python'

If you have feedback or need assistance with the MCP directory API, please join our Discord server