{"id":46811643,"url":"https://github.com/jobcelis-team/jobcelis-elixir","last_synced_at":"2026-03-10T08:01:30.406Z","repository":{"id":342718276,"uuid":"1174899230","full_name":"jobcelis-team/jobcelis-elixir","owner":"jobcelis-team","description":"Official Elixir SDK for the Jobcelis Event Infrastructure Platform","archived":false,"fork":false,"pushed_at":"2026-03-10T06:05:55.000Z","size":12,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-10T06:23:34.697Z","etag":null,"topics":["developer-tools","elixir","event-driven","events","hex-pm","sdk","webhooks"],"latest_commit_sha":null,"homepage":"https://jobcelis.com","language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jobcelis-team.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-07T00:57:52.000Z","updated_at":"2026-03-10T06:05:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jobcelis-team/jobcelis-elixir","commit_stats":null,"previous_names":["vladimirceli/jobcelis-elixir","jobcelis-team/jobcelis-elixir"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/jobcelis-team/jobcelis-elixir","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jobcelis-team%2Fjobcelis-elixir","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jobcelis-team%2Fjobcelis-elixir/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jobcelis-team%2Fjobcelis-elixir/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jobcelis-team%2Fjobcelis-elixir/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jobcelis-team","download_url":"https://codeload.github.com/jobcelis-team/jobcelis-elixir/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jobcelis-team%2Fjobcelis-elixir/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30327551,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T05:25:20.737Z","status":"ssl_error","status_checked_at":"2026-03-10T05:25:17.430Z","response_time":106,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["developer-tools","elixir","event-driven","events","hex-pm","sdk","webhooks"],"created_at":"2026-03-10T08:01:01.316Z","updated_at":"2026-03-10T08:01:30.370Z","avatar_url":"https://github.com/jobcelis-team.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Jobcelis\n\nOfficial Elixir SDK for the [Jobcelis](https://jobcelis.com) Event Infrastructure Platform.\n\nAll API calls go to `https://jobcelis.com` by default -- you only need your API key to get started.\n\n## Installation\n\nAdd `jobcelis` to your list of dependencies in `mix.exs`:\n\n```elixir\ndef deps do\n  [\n    {:jobcelis, \"~\u003e 1.0\"}\n  ]\nend\n```\n\nThen run:\n\n```bash\nmix deps.get\n```\n\n## Quick Start\n\n```elixir\n# Only your API key is required -- connects to https://jobcelis.com automatically\nclient = Jobcelis.client(\"your_api_key\")\n\n{:ok, event} = Jobcelis.send_event(client, \"order.created\", %{order_id: \"123\", amount: 99.99})\n```\n\n\u003e **Custom URL:** If you're self-hosting Jobcelis, you can override the base URL:\n\u003e ```elixir\n\u003e client = Jobcelis.client(\"your_api_key\", base_url: \"https://your-instance.example.com\")\n\u003e ```\n\n## Authentication\n\nThe auth methods do not require an API key. Use them to register, log in, and manage JWT tokens.\n\n```elixir\nclient = Jobcelis.client(\"\")\n\n# Register a new account\n{:ok, user} = Jobcelis.register(client, \"alice@example.com\", \"SecurePass123!\", name: \"Alice\")\n\n# Log in -- returns JWT access token and refresh token\n{:ok, session} = Jobcelis.login(client, \"alice@example.com\", \"SecurePass123!\")\naccess_token = session[\"token\"]\nrefresh_token = session[\"refresh_token\"]\n\n# Set the JWT for subsequent authenticated calls\nclient = Jobcelis.set_auth_token(client, access_token)\n\n# Refresh an expired token\n{:ok, new_session} = Jobcelis.refresh_token(client, refresh_token)\nclient = Jobcelis.set_auth_token(client, new_session[\"token\"])\n\n# Verify MFA (requires auth token already set)\n{:ok, result} = Jobcelis.verify_mfa(client, access_token, \"123456\")\n```\n\n## Events\n\n```elixir\n# Send a single event\n{:ok, event} = Jobcelis.send_event(client, \"order.created\", %{order_id: \"123\", amount: 99.99})\n\n# Send batch events (up to 1000)\n{:ok, batch} = Jobcelis.send_events(client, [\n  %{topic: \"order.created\", payload: %{order_id: \"1\"}},\n  %{topic: \"order.created\", payload: %{order_id: \"2\"}}\n])\n\n# List events with pagination\n{:ok, events} = Jobcelis.list_events(client, limit: 25)\n{:ok, next_page} = Jobcelis.list_events(client, limit: 25, cursor: events[\"cursor\"])\n\n# Get / delete a single event\n{:ok, event} = Jobcelis.get_event(client, \"evt_abc123\")\n:ok = Jobcelis.delete_event(client, \"evt_abc123\")\n```\n\n## Simulate\n\n```elixir\n# Dry-run an event to see which webhooks would fire\n{:ok, result} = Jobcelis.simulate_event(client, \"order.created\", %{order_id: \"test\"})\n```\n\n## Webhooks\n\n```elixir\n# Create a webhook\n{:ok, webhook} = Jobcelis.create_webhook(client, \"https://example.com/webhook\",\n  topics: [\"order.*\"]\n)\n\n# List, get, update, delete\n{:ok, webhooks} = Jobcelis.list_webhooks(client)\n{:ok, wh} = Jobcelis.get_webhook(client, \"wh_abc123\")\n{:ok, _} = Jobcelis.update_webhook(client, \"wh_abc123\", %{url: \"https://new-url.com/hook\"})\n:ok = Jobcelis.delete_webhook(client, \"wh_abc123\")\n\n# Health and templates\n{:ok, health} = Jobcelis.webhook_health(client, \"wh_abc123\")\n{:ok, templates} = Jobcelis.webhook_templates(client)\n```\n\n## Deliveries\n\n```elixir\n{:ok, deliveries} = Jobcelis.list_deliveries(client, limit: 20, status: \"failed\")\n{:ok, _} = Jobcelis.retry_delivery(client, \"del_abc123\")\n```\n\n## Dead Letters\n\n```elixir\n{:ok, dead_letters} = Jobcelis.list_dead_letters(client)\n{:ok, dl} = Jobcelis.get_dead_letter(client, \"dlq_abc123\")\n{:ok, _} = Jobcelis.retry_dead_letter(client, \"dlq_abc123\")\n{:ok, _} = Jobcelis.resolve_dead_letter(client, \"dlq_abc123\")\n```\n\n## Replays\n\n```elixir\n{:ok, replay} = Jobcelis.create_replay(client, \"order.created\",\n  \"2026-01-01T00:00:00Z\",\n  \"2026-01-31T23:59:59Z\",\n  webhook_id: \"wh_abc123\"  # optional\n)\n{:ok, replays} = Jobcelis.list_replays(client)\n{:ok, r} = Jobcelis.get_replay(client, \"rpl_abc123\")\n:ok = Jobcelis.cancel_replay(client, \"rpl_abc123\")\n```\n\n## Scheduled Jobs\n\n```elixir\n# Create a job\n{:ok, job} = Jobcelis.create_job(client, \"daily-report\", \"default\", \"0 9 * * *\",\n  payload: %{type: \"daily\"}\n)\n\n# CRUD\n{:ok, jobs} = Jobcelis.list_jobs(client, limit: 10)\n{:ok, job} = Jobcelis.get_job(client, \"job_abc123\")\n{:ok, _} = Jobcelis.update_job(client, \"job_abc123\", %{cron_expression: \"0 10 * * *\"})\n:ok = Jobcelis.delete_job(client, \"job_abc123\")\n\n# List runs for a job\n{:ok, runs} = Jobcelis.list_job_runs(client, \"job_abc123\", limit: 20)\n\n# Preview cron schedule\n{:ok, preview} = Jobcelis.cron_preview(client, \"0 9 * * *\", count: 10)\n```\n\n## Pipelines\n\n```elixir\n{:ok, pipeline} = Jobcelis.create_pipeline(client, \"order-processing\",\n  [\"order.created\"],\n  [\n    %{type: \"filter\", config: %{field: \"amount\", gt: 100}},\n    %{type: \"transform\", config: %{add_field: \"priority\", value: \"high\"}}\n  ]\n)\n\n{:ok, pipelines} = Jobcelis.list_pipelines(client)\n{:ok, p} = Jobcelis.get_pipeline(client, \"pipe_abc123\")\n{:ok, _} = Jobcelis.update_pipeline(client, \"pipe_abc123\", %{name: \"order-processing-v2\"})\n:ok = Jobcelis.delete_pipeline(client, \"pipe_abc123\")\n\n# Test a pipeline with a sample payload\n{:ok, result} = Jobcelis.test_pipeline(client, \"pipe_abc123\", %{\n  topic: \"order.created\",\n  payload: %{id: \"1\"}\n})\n```\n\n## Event Schemas\n\n```elixir\n{:ok, schema} = Jobcelis.create_event_schema(client, \"order.created\", %{\n  type: \"object\",\n  properties: %{\n    order_id: %{type: \"string\"},\n    amount: %{type: \"number\"}\n  },\n  required: [\"order_id\", \"amount\"]\n})\n\n{:ok, schemas} = Jobcelis.list_event_schemas(client)\n{:ok, s} = Jobcelis.get_event_schema(client, \"sch_abc123\")\n{:ok, _} = Jobcelis.update_event_schema(client, \"sch_abc123\", %{schema: %{type: \"object\"}})\n:ok = Jobcelis.delete_event_schema(client, \"sch_abc123\")\n\n# Validate a payload against a topic's schema\n{:ok, result} = Jobcelis.validate_payload(client, \"order.created\", %{order_id: \"123\", amount: 50})\n```\n\n## Sandbox\n\n```elixir\n# Create a temporary endpoint for testing\n{:ok, endpoint} = Jobcelis.create_sandbox_endpoint(client, name: \"my-test\")\n{:ok, endpoints} = Jobcelis.list_sandbox_endpoints(client)\n\n# Inspect received requests\n{:ok, requests} = Jobcelis.list_sandbox_requests(client, \"sbx_abc123\", limit: 20)\n\n:ok = Jobcelis.delete_sandbox_endpoint(client, \"sbx_abc123\")\n```\n\n## Analytics\n\n```elixir\n{:ok, events_chart} = Jobcelis.events_per_day(client, days: 30)\n{:ok, deliveries_chart} = Jobcelis.deliveries_per_day(client, days: 7)\n{:ok, topics} = Jobcelis.top_topics(client, limit: 5)\n{:ok, stats} = Jobcelis.webhook_stats(client)\n```\n\n## Project and Token Management\n\n```elixir\n# Current project\n{:ok, project} = Jobcelis.get_project(client)\n{:ok, _} = Jobcelis.update_project(client, %{name: \"My Project v2\"})\n\n# Topics\n{:ok, topics} = Jobcelis.list_topics(client)\n\n# API token\n{:ok, token} = Jobcelis.get_token(client)\n{:ok, new_token} = Jobcelis.regenerate_token(client)\n```\n\n## Multi-Project Management\n\n```elixir\n{:ok, projects} = Jobcelis.list_projects(client)\n{:ok, new_project} = Jobcelis.create_project(client, \"staging-env\")\n{:ok, p} = Jobcelis.get_project_by_id(client, \"proj_abc123\")\n{:ok, _} = Jobcelis.update_project_by_id(client, \"proj_abc123\", %{name: \"production-env\"})\n{:ok, _} = Jobcelis.set_default_project(client, \"proj_abc123\")\n:ok = Jobcelis.delete_project(client, \"proj_abc123\")\n```\n\n## Team Members\n\n```elixir\n{:ok, members} = Jobcelis.list_members(client, \"proj_abc123\")\n{:ok, member} = Jobcelis.add_member(client, \"proj_abc123\", \"alice@example.com\", role: \"admin\")\n{:ok, _} = Jobcelis.update_member(client, \"proj_abc123\", \"mem_abc123\", \"viewer\")\n:ok = Jobcelis.remove_member(client, \"proj_abc123\", \"mem_abc123\")\n```\n\n## Invitations\n\n```elixir\n# List pending invitations\n{:ok, invitations} = Jobcelis.list_pending_invitations(client)\n\n# Accept or reject\n{:ok, _} = Jobcelis.accept_invitation(client, \"inv_abc123\")\n{:ok, _} = Jobcelis.reject_invitation(client, \"inv_def456\")\n```\n\n## Audit Logs\n\n```elixir\n{:ok, logs} = Jobcelis.list_audit_logs(client, limit: 100)\n{:ok, next_page} = Jobcelis.list_audit_logs(client, cursor: logs[\"cursor\"])\n```\n\n## Data Export\n\nExport methods return raw binary (CSV or JSON).\n\n```elixir\n# Export as CSV\n{:ok, csv_data} = Jobcelis.export_events(client, format: \"csv\")\nFile.write!(\"events.csv\", csv_data)\n\n# Export as JSON\n{:ok, json_data} = Jobcelis.export_deliveries(client, format: \"json\")\n\n# Other exports\n{:ok, _} = Jobcelis.export_jobs(client, format: \"csv\")\n{:ok, _} = Jobcelis.export_audit_log(client, format: \"csv\")\n```\n\n## GDPR / Privacy\n\n```elixir\n# Consent management\n{:ok, consents} = Jobcelis.get_consents(client)\n{:ok, _} = Jobcelis.accept_consent(client, \"marketing\")\n\n# Data portability\n{:ok, my_data} = Jobcelis.export_my_data(client)\n\n# Processing restrictions\n{:ok, _} = Jobcelis.restrict_processing(client)\n:ok = Jobcelis.lift_restriction(client)\n\n# Right to object\n{:ok, _} = Jobcelis.object_to_processing(client)\n:ok = Jobcelis.restore_consent(client)\n```\n\n## Health Check\n\n```elixir\n{:ok, health} = Jobcelis.health(client)\n{:ok, status} = Jobcelis.status(client)\n```\n\n## Error Handling\n\nAll API calls return `{:ok, result}` on success or `{:error, %Jobcelis.Error{}}` on failure.\n\n```elixir\ncase Jobcelis.get_event(client, \"nonexistent\") do\n  {:ok, event} -\u003e\n    IO.inspect(event)\n\n  {:error, %Jobcelis.Error{status: 404, detail: detail}} -\u003e\n    IO.puts(\"Not found: #{inspect(detail)}\")\n\n  {:error, %Jobcelis.Error{status: status, detail: detail}} -\u003e\n    IO.puts(\"Error #{status}: #{inspect(detail)}\")\nend\n```\n\n## Webhook Signature Verification\n\n```elixir\n# In a Phoenix controller\ndef webhook(conn, _params) do\n  {:ok, body, conn} = Plug.Conn.read_body(conn)\n  signature = Plug.Conn.get_req_header(conn, \"x-signature\") |\u003e List.first(\"\")\n\n  if Jobcelis.WebhookVerifier.verify(\"your_webhook_secret\", body, signature) do\n    event = Jason.decode!(body)\n    IO.puts(\"Received: #{event[\"topic\"]}\")\n    send_resp(conn, 200, \"OK\")\n  else\n    send_resp(conn, 401, \"Invalid signature\")\n  end\nend\n```\n\n## License\n\nBSL-1.1 (Business Source License)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjobcelis-team%2Fjobcelis-elixir","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjobcelis-team%2Fjobcelis-elixir","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjobcelis-team%2Fjobcelis-elixir/lists"}