Skip to main content

jobcelis

Official Python SDK for the Jobcelis Event Infrastructure Platform.

All API calls go to https://jobcelis.com by default — you only need your API key to get started.

Installation

pip install jobcelis

Quick Start

from jobcelis import JobcelisClient

# Only your API key is required — connects to https://jobcelis.com automatically
client = JobcelisClient(api_key="your_api_key")

Custom URL: If you're self-hosting Jobcelis, you can override the base URL:

client = JobcelisClient(api_key="your_api_key", base_url="https://your-instance.example.com")

Authentication

The auth methods do not require an API key. Use them to register, log in, and manage JWT tokens.

from jobcelis import JobcelisClient

client = JobcelisClient(api_key="")

# Register a new account
user = client.register("alice@example.com", "SecurePass123!", name="Alice")

# Log in — returns JWT access token and refresh token
session = client.login("alice@example.com", "SecurePass123!")
access_token = session["token"]
refresh_token = session["refresh_token"]

# Set the JWT for subsequent authenticated calls
client.set_auth_token(access_token)

# Refresh an expired token
new_session = client.refresh_token(refresh_token)
client.set_auth_token(new_session["token"])

# Verify MFA (requires Bearer token already set)
result = client.verify_mfa(token=access_token, code="123456")

Events

# Send a single event
event = client.send_event("order.created", {"order_id": "123", "amount": 99.99})

# Send batch events (up to 1000)
batch = client.send_events([
    {"topic": "order.created", "payload": {"order_id": "1"}},
    {"topic": "order.created", "payload": {"order_id": "2"}},
])

# List events with pagination
events = client.list_events(limit=25)
next_page = client.list_events(limit=25, cursor=events["cursor"])

# Get / delete a single event
event = client.get_event("evt_abc123")
client.delete_event("evt_abc123")

Webhooks

# Create a webhook
webhook = client.create_webhook(
    url="https://example.com/webhook",
    topics=["order.*"],
)

# List, get, update, delete
webhooks = client.list_webhooks()
wh = client.get_webhook("wh_abc123")
client.update_webhook("wh_abc123", url="https://new-url.com/hook")
client.delete_webhook("wh_abc123")

# Health and templates
health = client.webhook_health("wh_abc123")
templates = client.webhook_templates()

Deliveries

deliveries = client.list_deliveries(limit=20, status="failed")
client.retry_delivery("del_abc123")

Dead Letters

dead_letters = client.list_dead_letters()
dl = client.get_dead_letter("dlq_abc123")
client.retry_dead_letter("dlq_abc123")
client.resolve_dead_letter("dlq_abc123")

Replays

replay = client.create_replay(
    topic="order.created",
    from_date="2026-01-01T00:00:00Z",
    to_date="2026-01-31T23:59:59Z",
    webhook_id="wh_abc123",  # optional
)
replays = client.list_replays()
r = client.get_replay("rpl_abc123")
client.cancel_replay("rpl_abc123")

Scheduled Jobs

# Create a job
job = client.create_job(
    name="daily-report",
    queue="default",
    cron_expression="0 9 * * *",
    payload={"type": "daily"},
)

# CRUD
jobs = client.list_jobs(limit=10)
job = client.get_job("job_abc123")
client.update_job("job_abc123", cron_expression="0 10 * * *")
client.delete_job("job_abc123")

# List runs for a job
runs = client.list_job_runs("job_abc123", limit=20)

# Preview cron schedule
preview = client.cron_preview("0 9 * * *", count=10)

Pipelines

pipeline = client.create_pipeline(
    name="order-processing",
    topics=["order.created"],
    steps=[
        {"type": "filter", "config": {"field": "amount", "gt": 100}},
        {"type": "transform", "config": {"add_field": "priority", "value": "high"}},
    ],
)

pipelines = client.list_pipelines()
p = client.get_pipeline("pipe_abc123")
client.update_pipeline("pipe_abc123", name="order-processing-v2")
client.delete_pipeline("pipe_abc123")

# Test a pipeline with a sample payload
result = client.test_pipeline("pipe_abc123", {"topic": "order.created", "payload": {"id": "1"}})

Invitations

# List pending invitations
invitations = client.list_pending_invitations()

# Accept or reject
client.accept_invitation("inv_abc123")
client.reject_invitation("inv_def456")

Event Schemas

schema = client.create_event_schema(
    topic="order.created",
    schema={
        "type": "object",
        "properties": {
            "order_id": {"type": "string"},
            "amount": {"type": "number"},
        },
        "required": ["order_id", "amount"],
    },
)

schemas = client.list_event_schemas()
s = client.get_event_schema("sch_abc123")
client.update_event_schema("sch_abc123", schema={"type": "object"})
client.delete_event_schema("sch_abc123")

# Validate a payload against a topic's schema
result = client.validate_payload("order.created", {"order_id": "123", "amount": 50})

Sandbox

# Create a temporary endpoint for testing
endpoint = client.create_sandbox_endpoint(name="my-test")
endpoints = client.list_sandbox_endpoints()

# Inspect received requests
requests = client.list_sandbox_requests("sbx_abc123", limit=20)

client.delete_sandbox_endpoint("sbx_abc123")

Analytics

events_chart = client.events_per_day(days=30)
deliveries_chart = client.deliveries_per_day(days=7)
topics = client.top_topics(limit=5)
stats = client.webhook_stats()

Project and Token Management

# Current project
project = client.get_project()
client.update_project(name="My Project v2")

# Topics
topics = client.list_topics()

# API token
token = client.get_token()
new_token = client.regenerate_token()

Multi-Project Management

projects = client.list_projects()
new_project = client.create_project("staging-env")
p = client.get_project_by_id("proj_abc123")
client.update_project_by_id("proj_abc123", name="production-env")
client.set_default_project("proj_abc123")
client.delete_project("proj_abc123")

Team Members

members = client.list_members("proj_abc123")
member = client.add_member("proj_abc123", "alice@example.com", role="admin")
client.update_member("proj_abc123", "mem_abc123", role="viewer")
client.remove_member("proj_abc123", "mem_abc123")

Audit Logs

logs = client.list_audit_logs(limit=100)
next_page = client.list_audit_logs(cursor=logs["cursor"])

Data Export

Export methods return raw bytes (CSV or JSON).

# Export as CSV
csv_data = client.export_events(format="csv")
with open("events.csv", "wb") as f:
    f.write(csv_data)

# Export as JSON
json_data = client.export_deliveries(format="json")

# Other exports
client.export_jobs(format="csv")
client.export_audit_log(format="csv")

Simulate

# Dry-run an event to see which webhooks would fire
result = client.simulate_event("order.created", {"order_id": "test"})

GDPR / Privacy

# Consent management
consents = client.get_consents()
client.accept_consent("marketing")

# Data portability
my_data = client.export_my_data()

# Processing restrictions
client.restrict_processing()
client.lift_restriction()

# Right to object
client.object_to_processing()
client.restore_consent()

Health Check

health = client.health()
status = client.status()

Error Handling

from jobcelis import JobcelisClient, JobcelisError

client = JobcelisClient(api_key="your_api_key")

try:
    event = client.get_event("nonexistent")
except JobcelisError as e:
    print(f"Status: {e.status}")   # 404
    print(f"Detail: {e.detail}")   # {"message": "Not found"}

Webhook Signature Verification

from jobcelis import verify_webhook_signature

# Flask example
@app.route('/webhook', methods=['POST'])
def handle_webhook():
    is_valid = verify_webhook_signature(
        secret='your_webhook_secret',
        body=request.get_data(as_text=True),
        signature=request.headers.get('X-Signature', '')
    )

    if not is_valid:
        return 'Invalid signature', 401

    event = request.get_json()
    print(f"Received: {event['topic']}")
    return 'OK', 200

License

BSL-1.1 (Business Source License)

Release files for jobcelis 1.5.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jobcelis 1.5.1
File Size Uploaded
jobcelis-1.5.1.tar.gz 11.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for jobcelis 1.5.1
File Interpreter ABI Platform
jobcelis-1.5.1-py3-none-any.whl Python 3 none any Details

Total release size: 20.9 kB

Release files / jobcelis-1.5.1.tar.gz

Download URL jobcelis-1.5.1.tar.gz
Size 11.4 kB
Tags Source
SHA-256 checksum
How to use checksums
08fa0054c1d0dd22ea1c7b31adf84b8d91ebea81ed619e883f86c3fea383a266
BLAKE2b-256 checksum
How to use checksums
8b885c6cf51f808d61468d19307cb3e248dc0688a36aea32adc13b8e35a70c8d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12

Release files / jobcelis-1.5.1-py3-none-any.whl

Download URL jobcelis-1.5.1-py3-none-any.whl
Size 9.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d919c1eebd25e25b795a9157ca2ff5f5ff34bf9f2429747138b8fdda4515e0ef
BLAKE2b-256 checksum
How to use checksums
76b9bf2ce4cd22a39298ede9dad67a66c56a17359fedae2b15654034f7b785df
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12

Release history Release notifications | RSS feed

This release

1.5.1 This release

2 release files

1.5.0

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page