Back to Documentation
    DocumentationapiFeb 7, 2025

    Growth Tickets API Reference

    Complete API reference for accessing and managing AI-generated growth tickets, including filtering, prioritization, and status management.

    Overview

    The Growth Tickets API provides programmatic access to AI-generated growth recommendations and action items. Tickets are automatically generated based on data analysis and can be filtered, prioritized, and integrated into your project management workflows.

    Base URL: https://api.cogny.com/v1/tickets

    Authentication: Bearer token (see API Authentication)

    List Tickets

    Retrieve growth tickets with filtering and pagination.

    Endpoint

    GET /v1/tickets
    

    Query Parameters

    ParameterTypeDescription
    warehouse_idstringFilter by warehouse ID
    statusstringFilter by status (open, in_progress, completed, dismissed)
    prioritystringFilter by priority (critical, high, medium, low)
    categorystringFilter by category (see categories below)
    created_afterstringISO 8601 timestamp
    created_beforestringISO 8601 timestamp
    updated_afterstringISO 8601 timestamp
    sortstringSort field (e.g., -priority, created_at)
    limitintegerItems per page (max: 100)
    cursorstringPagination cursor

    Categories

    • conversion_optimization - Improve conversion rates
    • funnel_optimization - Reduce funnel drop-off
    • user_engagement - Increase engagement metrics
    • revenue_growth - Boost revenue and AOV
    • retention - Improve user retention
    • acquisition - Optimize user acquisition
    • technical_performance - Fix technical issues
    • data_quality - Improve data collection

    Response

    {
      "success": true,
      "data": [
        {
          "id": "tkt_abc123",
          "warehouse_id": "wh_123abc",
          "title": "Optimize Mobile Checkout Flow",
          "description": "Mobile users abandon cart at 2x desktop rate. Cart abandonment peaks at payment step (41%).",
          "category": "conversion_optimization",
          "priority": "high",
          "status": "open",
          "estimated_impact": {
            "metric": "conversion_rate",
            "current_value": 0.027,
            "projected_value": 0.034,
            "increase_percentage": 25.9,
            "confidence": 0.85
          },
          "effort": "medium",
          "action_items": [
            {
              "title": "Implement one-click checkout for returning users",
              "description": "Add Apple Pay and Google Pay integration",
              "estimated_hours": 16,
              "completed": false
            },
            {
              "title": "Reduce form fields from 12 to 6",
              "description": "Remove redundant fields and auto-fill where possible",
              "estimated_hours": 8,
              "completed": false
            }
          ],
          "supporting_data": {
            "mobile_conversion_rate": 0.027,
            "desktop_conversion_rate": 0.035,
            "cart_abandonment_rate": 0.41,
            "sample_size": 45000
          },
          "related_report_id": "rpt_xyz789",
          "created_at": "2025-02-07T10:30:00Z",
          "updated_at": "2025-02-07T10:30:00Z",
          "url": "https://app.cogny.com/tickets/tkt_abc123"
        }
      ],
      "pagination": {
        "has_more": true,
        "next_cursor": "eyJpZCI6InRrdF9hYmMxMjMifQ",
        "total_count": 23
      }
    }
    

    Example Request (cURL)

    curl -X GET "https://api.cogny.com/v1/tickets?warehouse_id=wh_123abc&status=open&priority=high&sort=-priority" \
      -H "Authorization: Bearer sk_live_abc123xyz789"
    

    Example Request (Python)

    import requests
    
    API_KEY = "sk_live_abc123xyz789"
    BASE_URL = "https://api.cogny.com/v1"
    
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }
    
    params = {
        "warehouse_id": "wh_123abc",
        "status": "open",
        "priority": "high",
        "sort": "-priority",
        "limit": 50
    }
    
    response = requests.get(
        f"{BASE_URL}/tickets",
        headers=headers,
        params=params
    )
    
    tickets = response.json()["data"]
    print(f"Found {len(tickets)} high-priority open tickets")
    
    for ticket in tickets:
        print(f"- [{ticket['priority'].upper()}] {ticket['title']}")
        print(f"  Impact: +{ticket['estimated_impact']['increase_percentage']:.1f}% {ticket['estimated_impact']['metric']}")
    

    Get Ticket

    Retrieve detailed information for a specific ticket.

    Endpoint

    GET /v1/tickets/{ticket_id}
    

    Response

    Same structure as individual ticket in list response, with full details.

    Example

    curl -X GET https://api.cogny.com/v1/tickets/tkt_abc123 \
      -H "Authorization: Bearer sk_live_abc123xyz789"
    

    Update Ticket

    Update ticket status, priority, or other fields.

    Endpoint

    PATCH /v1/tickets/{ticket_id}
    

    Request Body

    {
      "status": "in_progress",
      "priority": "critical",
      "assignee": "user_456",
      "notes": "Started implementation. Targeting completion by end of week.",
      "action_items": [
        {
          "title": "Implement one-click checkout for returning users",
          "completed": true
        },
        {
          "title": "Reduce form fields from 12 to 6",
          "completed": false
        }
      ]
    }
    

    Parameters

    ParameterTypeDescription
    statusstringUpdate status (open, in_progress, completed, dismissed)
    prioritystringUpdate priority (critical, high, medium, low)
    assigneestringAssign to user ID
    notesstringAdd notes or comments
    action_itemsarrayUpdate action item completion status

    Response

    {
      "success": true,
      "data": {
        "id": "tkt_abc123",
        "status": "in_progress",
        "priority": "critical",
        "assignee": "user_456",
        "notes": "Started implementation. Targeting completion by end of week.",
        "updated_at": "2025-02-07T15:45:00Z"
      }
    }
    

    Example (Python)

    # Update ticket status
    update = {
        "status": "in_progress",
        "assignee": "user_456",
        "notes": "Started implementation"
    }
    
    response = requests.patch(
        f"{BASE_URL}/tickets/tkt_abc123",
        headers=headers,
        json=update
    )
    
    ticket = response.json()["data"]
    print(f"Ticket updated: {ticket['status']}")
    

    Bulk Update Tickets

    Update multiple tickets in a single request.

    Endpoint

    POST /v1/tickets/bulk-update
    

    Request Body

    {
      "ticket_ids": ["tkt_abc123", "tkt_def456", "tkt_ghi789"],
      "updates": {
        "status": "in_progress",
        "assignee": "user_456"
      }
    }
    

    Response

    {
      "success": true,
      "data": {
        "updated_count": 3,
        "failed_count": 0,
        "updated_ids": ["tkt_abc123", "tkt_def456", "tkt_ghi789"]
      }
    }
    

    Dismiss Ticket

    Mark a ticket as dismissed with optional reason.

    Endpoint

    POST /v1/tickets/{ticket_id}/dismiss
    

    Request Body

    {
      "reason": "not_applicable",
      "notes": "Already implemented similar solution in Q4 2024"
    }
    

    Dismiss Reasons

    • not_applicable - Recommendation doesn't apply to business
    • already_implemented - Solution already in place
    • insufficient_impact - Expected impact too low to justify effort
    • resource_constraints - Lack resources to implement
    • other - Other reason (provide notes)

    Response

    {
      "success": true,
      "data": {
        "id": "tkt_abc123",
        "status": "dismissed",
        "dismissed_at": "2025-02-07T16:00:00Z",
        "dismiss_reason": "already_implemented",
        "notes": "Already implemented similar solution in Q4 2024"
      }
    }
    

    Get Ticket Statistics

    Retrieve aggregated statistics for tickets.

    Endpoint

    GET /v1/tickets/stats
    

    Query Parameters

    ParameterTypeDescription
    warehouse_idstringFilter by warehouse ID
    created_afterstringISO 8601 timestamp
    created_beforestringISO 8601 timestamp

    Response

    {
      "success": true,
      "data": {
        "total_tickets": 47,
        "by_status": {
          "open": 23,
          "in_progress": 12,
          "completed": 8,
          "dismissed": 4
        },
        "by_priority": {
          "critical": 5,
          "high": 15,
          "medium": 18,
          "low": 9
        },
        "by_category": {
          "conversion_optimization": 12,
          "funnel_optimization": 8,
          "user_engagement": 7,
          "revenue_growth": 6,
          "retention": 5,
          "acquisition": 4,
          "technical_performance": 3,
          "data_quality": 2
        },
        "estimated_total_impact": {
          "conversion_rate_increase": 0.15,
          "revenue_increase_percentage": 23.5,
          "users_retained": 1250
        },
        "completion_rate": 0.17,
        "average_time_to_complete_days": 14.5
      }
    }
    

    Example (Python)

    # Get ticket statistics
    response = requests.get(
        f"{BASE_URL}/tickets/stats",
        headers=headers,
        params={"warehouse_id": "wh_123abc"}
    )
    
    stats = response.json()["data"]
    
    print(f"Total tickets: {stats['total_tickets']}")
    print(f"Open: {stats['by_status']['open']}")
    print(f"High priority: {stats['by_priority']['high']}")
    print(f"Estimated revenue increase: +{stats['estimated_total_impact']['revenue_increase_percentage']:.1f}%")
    

    Export Tickets

    Export tickets to various formats for external systems.

    Endpoint

    POST /v1/tickets/export
    

    Request Body

    {
      "format": "csv",
      "filters": {
        "warehouse_id": "wh_123abc",
        "status": "open",
        "priority": ["critical", "high"]
      },
      "include_fields": [
        "title",
        "description",
        "priority",
        "status",
        "estimated_impact",
        "action_items"
      ]
    }
    

    Supported Formats

    • csv - Comma-separated values
    • json - JSON format
    • xlsx - Excel spreadsheet
    • jira - JIRA import format
    • asana - Asana import format
    • linear - Linear import format

    Response

    {
      "success": true,
      "data": {
        "export_id": "exp_xyz123",
        "format": "csv",
        "status": "completed",
        "download_url": "https://api.cogny.com/v1/tickets/exports/exp_xyz123/download",
        "expires_at": "2025-02-08T10:30:00Z",
        "ticket_count": 23
      }
    }
    

    Example (Python - Export to CSV)

    # Export tickets to CSV
    export_request = {
        "format": "csv",
        "filters": {
            "warehouse_id": "wh_123abc",
            "status": "open"
        }
    }
    
    response = requests.post(
        f"{BASE_URL}/tickets/export",
        headers=headers,
        json=export_request
    )
    
    export = response.json()["data"]
    
    # Download the export
    download_response = requests.get(
        export["download_url"],
        headers=headers
    )
    
    with open("cogny_tickets.csv", "wb") as f:
        f.write(download_response.content)
    
    print(f"Exported {export['ticket_count']} tickets to cogny_tickets.csv")
    

    Webhooks

    Subscribe to ticket events via webhooks.

    Event Types

    • ticket.created - New ticket generated
    • ticket.updated - Ticket fields updated
    • ticket.status_changed - Status changed
    • ticket.completed - Ticket marked as completed
    • ticket.dismissed - Ticket dismissed

    Webhook Payload

    {
      "id": "evt_abc123",
      "type": "ticket.status_changed",
      "created_at": "2025-02-07T10:30:00Z",
      "data": {
        "ticket_id": "tkt_abc123",
        "warehouse_id": "wh_123abc",
        "previous_status": "open",
        "new_status": "in_progress",
        "changed_by": "user_456",
        "ticket": {
          "title": "Optimize Mobile Checkout Flow",
          "priority": "high",
          "category": "conversion_optimization"
        }
      }
    }
    

    Configure Webhook

    curl -X POST https://api.cogny.com/v1/webhooks \
      -H "Authorization: Bearer sk_live_abc123xyz789" \
      -H "Content-Type: application/json" \
      -d '{
        "url": "https://your-app.com/webhooks/cogny",
        "events": ["ticket.created", "ticket.status_changed"],
        "secret": "whsec_your_webhook_secret"
      }'
    

    Integration Examples

    Sync to JIRA

    import requests
    from jira import JIRA
    
    # Cogny configuration
    COGNY_API_KEY = "sk_live_abc123xyz789"
    COGNY_BASE_URL = "https://api.cogny.com/v1"
    
    # JIRA configuration
    JIRA_URL = "https://your-domain.atlassian.net"
    JIRA_EMAIL = "your-email@example.com"
    JIRA_API_TOKEN = "your_jira_token"
    
    cogny_headers = {
        "Authorization": f"Bearer {COGNY_API_KEY}",
        "Content-Type": "application/json"
    }
    
    jira = JIRA(server=JIRA_URL, basic_auth=(JIRA_EMAIL, JIRA_API_TOKEN))
    
    def sync_tickets_to_jira(warehouse_id, jira_project_key):
        """Sync open Cogny tickets to JIRA"""
    
        # Get open tickets from Cogny
        response = requests.get(
            f"{COGNY_BASE_URL}/tickets",
            headers=cogny_headers,
            params={
                "warehouse_id": warehouse_id,
                "status": "open",
                "limit": 100
            }
        )
    
        tickets = response.json()["data"]
    
        for ticket in tickets:
            # Map Cogny priority to JIRA
            priority_map = {
                "critical": "Highest",
                "high": "High",
                "medium": "Medium",
                "low": "Low"
            }
    
            # Create JIRA issue
            issue_dict = {
                'project': {'key': jira_project_key},
                'summary': ticket['title'],
                'description': f"{ticket['description']}\n\n"
                             f"Category: {ticket['category']}\n"
                             f"Estimated Impact: +{ticket['estimated_impact']['increase_percentage']:.1f}%\n"
                             f"Effort: {ticket['effort']}\n\n"
                             f"Source: {ticket['url']}",
                'issuetype': {'name': 'Task'},
                'priority': {'name': priority_map[ticket['priority']]}
            }
    
            jira_issue = jira.create_issue(fields=issue_dict)
    
            # Create subtasks for action items
            for action_item in ticket['action_items']:
                subtask_dict = {
                    'project': {'key': jira_project_key},
                    'summary': action_item['title'],
                    'description': action_item['description'],
                    'issuetype': {'name': 'Sub-task'},
                    'parent': {'key': jira_issue.key}
                }
                jira.create_issue(fields=subtask_dict)
    
            print(f"Created JIRA issue {jira_issue.key}: {ticket['title']}")
    
            # Update Cogny ticket with JIRA reference
            requests.patch(
                f"{COGNY_BASE_URL}/tickets/{ticket['id']}",
                headers=cogny_headers,
                json={
                    "notes": f"Synced to JIRA: {jira_issue.key}"
                }
            )
    
    # Usage
    sync_tickets_to_jira("wh_123abc", "GROWTH")
    

    Slack Notifications

    import requests
    
    SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
    
    def notify_high_priority_tickets(warehouse_id):
        """Send Slack notification for high-priority tickets"""
    
        # Get high-priority tickets
        response = requests.get(
            f"{COGNY_BASE_URL}/tickets",
            headers=cogny_headers,
            params={
                "warehouse_id": warehouse_id,
                "status": "open",
                "priority": "high"
            }
        )
    
        tickets = response.json()["data"]
    
        if not tickets:
            return
    
        # Format Slack message
        blocks = [
            {
                "type": "header",
                "text": {
                    "type": "plain_text",
                    "text": f"🚀 {len(tickets)} High-Priority Growth Opportunities"
                }
            }
        ]
    
        for ticket in tickets[:5]:  # Show top 5
            impact = ticket['estimated_impact']
            blocks.append({
                "type": "section",
                "text": {
                    "type": "mrkdwn",
                    "text": f"*{ticket['title']}*\n"
                           f"Category: {ticket['category']}\n"
                           f"Impact: +{impact['increase_percentage']:.1f}% {impact['metric']}\n"
                           f"Effort: {ticket['effort']}"
                },
                "accessory": {
                    "type": "button",
                    "text": {
                        "type": "plain_text",
                        "text": "View Ticket"
                    },
                    "url": ticket['url']
                }
            })
    
        # Send to Slack
        requests.post(SLACK_WEBHOOK_URL, json={"blocks": blocks})
    
    # Usage
    notify_high_priority_tickets("wh_123abc")
    

    Best Practices

    1. Prioritize by Impact

    Focus on tickets with highest estimated impact:

    response = requests.get(
        f"{BASE_URL}/tickets",
        headers=headers,
        params={
            "warehouse_id": "wh_123abc",
            "status": "open",
            "sort": "-estimated_impact.increase_percentage",
            "limit": 10
        }
    )
    
    top_tickets = response.json()["data"]
    

    2. Track Completion

    Update ticket status as work progresses:

    def update_ticket_progress(ticket_id, completed_action_index):
        """Mark action item as completed"""
    
        # Get current ticket
        response = requests.get(
            f"{BASE_URL}/tickets/{ticket_id}",
            headers=headers
        )
        ticket = response.json()["data"]
    
        # Update action items
        action_items = ticket["action_items"]
        action_items[completed_action_index]["completed"] = True
    
        # Check if all items completed
        all_completed = all(item["completed"] for item in action_items)
        new_status = "completed" if all_completed else "in_progress"
    
        # Update ticket
        requests.patch(
            f"{BASE_URL}/tickets/{ticket_id}",
            headers=headers,
            json={
                "status": new_status,
                "action_items": action_items
            }
        )
    

    3. Regular Sync

    Sync tickets to your project management system regularly:

    import schedule
    import time
    
    def sync_job():
        """Regular sync job"""
        sync_tickets_to_jira("wh_123abc", "GROWTH")
        notify_high_priority_tickets("wh_123abc")
    
    # Run every hour
    schedule.every().hour.do(sync_job)
    
    while True:
        schedule.run_pending()
        time.sleep(60)
    

    Next Steps

    Need Implementation Help?

    Talk to Our Technical Team

    Schedule a technical consultation to discuss your integration requirements and implementation strategy.

    Schedule Demo