← Back to list

Java OCA & OCP Certification Roadmap: A Complete Study Guide from Beginner to Expert — Part 2

Now that you understand what Java certifications are and why they matter, it’s time to get tactical. In this part, we’ll build a…

Ahmet Emre DEMİRŞEN in @Override · 2025-12-12 14:25 · 70 claps · 13.4 min read paywalled
#java #oca #ocp #certification
Open on Medium ↗

Java OCA & OCP Certification Roadmap: A Complete Study Guide from Beginner to Expert — Part 2

Now that you understand what Java certifications are and why they matter, it’s time to get tactical. In this part, we’ll build a customized study plan that fits your schedule, explore the best learning resources available, and dive deep into core Java fundamentals with practical examples that mirror real exam questions.

You can read this article for free by clicking **here**.

This article is Part 2 of the Java OCA & OCP Certification Roadmap series. To read Part 1 click here.

Table of Contents

  1. Creating Your Personalized Study Plan
  2. Best Learning Resources and Study Materials
  3. Core Java Fundamentals Deep Dive
  4. Object-Oriented Programming Mastery

1. Creating Your Personalized Study Plan

The difference between passing and failing often comes down to having a structured, realistic study plan. Let’s build one that actually works for your life circumstances.

Assessing Your Current Skill Level

Before creating a timeline, honestly evaluate where you stand:

Complete Beginner (0–6 months Java experience):

  • Study duration for OCA: 3–4 months (10–15 hours/week)
  • Recommended approach: Start with fundamentals, no shortcuts
  • Focus: 70% learning concepts, 30% practice questions

Intermediate Developer (6–18 months experience):

  • Study duration for OCA: 6–8 weeks (8–10 hours/week)
  • Study duration for OCP: 2–3 months (10–15 hours/week)
  • Focus: 40% review, 60% practice and exam simulation

Experienced Developer (2+ years):

  • Study duration for OCP: 6–8 weeks (8–12 hours/week)
  • Focus: 30% knowledge gaps, 70% exam strategy and practice tests

The 12-Week OCA Study Blueprint

Here’s a proven study plan for someone with basic programming knowledge:

Weeks 1–2: Java Basics Foundation

// Daily practice: Write simple programs like this
public class DailyPractice {
    public static void main(String[] args) {
        // Week 1: Focus on syntax, data types, operators
        int age = 25;
        double salary = 50000.50;
        boolean isEmployed = true;

        // Week 2: Control flow and loops
        for (int i = 0; i < 5; i++) {
            if (i % 2 == 0) {
                System.out.println(i + " is even");
            }
        }
    }
}
  • Study goals: Variables, data types, operators, control flow
  • Practice: 50 problems on HackerRank or similar platforms
  • Time allocation: 2 hours theory, 1.5 hours coding daily

Weeks 3–4: Object-Oriented Programming

// Practice creating classes with proper encapsulation
public class BankAccount {
    private String accountNumber;
    private double balance;

    public BankAccount(String accountNumber, double initialBalance) {
        this.accountNumber = accountNumber;
        this.balance = initialBalance;
    }

    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }

    public boolean withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
            return true;
        }
        return false;
    }

    public double getBalance() {
        return balance;
    }
}
  • Study goals: Classes, objects, inheritance, polymorphism, encapsulation
  • Practice: Build 3–4 small projects (Calculator, Library System, Shopping Cart)
  • Time allocation: 3 hours theory, 2 hours hands-on coding

Weeks 5–6: Arrays, Collections, and Strings

import java.util.ArrayList;
import java.util.Arrays;

public class CollectionsPractice {
    public static void main(String[] args) {
        // Arrays
        int[] numbers = {1, 2, 3, 4, 5};
        System.out.println(Arrays.toString(numbers));

        // ArrayList
        ArrayList<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        names.remove(0);
        System.out.println(names.size());

        // String manipulation
        String text = "Hello World";
        System.out.println(text.substring(0, 5));
        System.out.println(text.toLowerCase());
    }
}
  • Study goals: Array operations, ArrayList methods, String API
  • Practice: 100+ method signature memorization, manipulation exercises
  • Time allocation: 2.5 hours theory, 2 hours practice

Weeks 7–8: Exception Handling and Core APIs

import java.time.LocalDate;
import java.time.Period;

public class ExceptionsPractice {
    public static void main(String[] args) {
        try {
            int result = divide(10, 0);
            System.out.println(result);
        } catch (ArithmeticException e) {
            System.out.println("Cannot divide by zero");
        } finally {
            System.out.println("Cleanup code");
        }

        // Date/Time API practice
        LocalDate today = LocalDate.now();
        LocalDate birthday = LocalDate.of(1990, 1, 1);
        Period age = Period.between(birthday, today);
        System.out.println("Age: " + age.getYears());
    }

    public static int divide(int a, int b) {
        return a / b;
    }
}
  • Study goals: Try-catch-finally, exception types, Date/Time API
  • Practice: Create programs with comprehensive error handling
  • Time allocation: 3 hours theory, 2 hours coding

Weeks 9–10: Practice Tests and Weak Areas

  • Take 2–3 full-length practice exams
  • Identify patterns in mistakes
  • Deep dive into weak topics
  • Time allocation: 4 hours practice tests, 6 hours reviewing mistakes

Weeks 11–12: Final Review and Exam Simulation

  • Daily practice tests (1–2 hours)
  • Review all flagged questions
  • Study exam strategy and time management
  • Take final full-length mock exam under timed conditions

The 10-Week OCP Study Blueprint

Weeks 1–2: Advanced Class Design

// Abstract classes and interfaces
public abstract class Shape {
    protected String color;

    public Shape(String color) {
        this.color = color;
    }

    public abstract double calculateArea();

    public void display() {
        System.out.println("Color: " + color);
    }
}

interface Drawable {
    void draw();
}

class Circle extends Shape implements Drawable {
    private double radius;

    public Circle(String color, double radius) {
        super(color);
        this.radius = radius;
    }

    @Override
    public double calculateArea() {
        return Math.PI * radius * radius;
    }

    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

Weeks 3–4: Generics and Collections Framework

import java.util.*;

public class GenericsExample<T extends Comparable<T>> {
    private List<T> items = new ArrayList<>();

    public void add(T item) {
        items.add(item);
    }

    public T getMax() {
        if (items.isEmpty()) {
            return null;
        }
        return Collections.max(items);
    }

    public static void main(String[] args) {
        GenericsExample<Integer> numbers = new GenericsExample<>();
        numbers.add(5);
        numbers.add(10);
        numbers.add(3);
        System.out.println("Max: " + numbers.getMax());
    }
}

Weeks 5–6: Lambda Expressions and Stream API

import java.util.*;
import java.util.stream.*;

public class StreamExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // Filter, map, and collect
        List<Integer> evenSquares = numbers.stream()
            .filter(n -> n % 2 == 0)
            .map(n -> n * n)
            .collect(Collectors.toList());

        System.out.println(evenSquares); // [4, 16, 36, 64, 100]

        // Method references
        numbers.forEach(System.out::println);

        // Reduce operation
        int sum = numbers.stream()
            .reduce(0, Integer::sum);

        System.out.println("Sum: " + sum);
    }
}

Weeks 7–8: Concurrency and I/O Weeks 9–10: Practice Tests and Review

Study Schedule Templates

For Working Professionals (8–10 hours/week):

  • Weekday mornings: 1 hour before work (theory reading)
  • Weekday evenings: 1 hour after work (coding practice)
  • Weekends: 3–4 hours (deep study and practice tests)

For Students (15–20 hours/week):

  • Daily: 2–3 hours structured study
  • Practice coding: 1 hour minimum
  • Mock tests: 2 full tests per week

Tracking Progress Template:

// Create a simple study tracker
public class StudyTracker {
    private Map<String, Integer> topicHours = new HashMap<>();
    private int totalHours = 0;

    public void logStudySession(String topic, int hours) {
        topicHours.put(topic, topicHours.getOrDefault(topic, 0) + hours);
        totalHours += hours;
        System.out.println("Logged " + hours + " hours for " + topic);
        System.out.println("Total study time: " + totalHours + " hours");
    }
}

2. Best Learning Resources and Study Materials

Choosing the right resources can save you dozens of hours and hundreds of dollars. Here’s what actually works based on thousands of successful candidates.

Official Oracle Resources (Essential)

1. Oracle Official Study Guides

  • OCA Java SE 8 Programmer I Study Guide by Jeanne Boyarsky & Scott Selikoff
  • OCP Java SE 11 Programmer I & II Study Guide by Jeanne Boyarsky & Scott Selikoff
  • Why they’re essential: Written by exam creators, cover 100% of objectives
  • Cost: $40-$60 per book
  • Rating: ⭐⭐⭐⭐⭐ (5/5)

2. Oracle Java Documentation

Practice Exam Platforms (Critical)

1. Enthuware (Highest Recommended)

Price: $10-$15
Questions: 600+ per exam
Accuracy: 95% match to real exam
Difficulty: Slightly harder than actual exam (good!)
  • Why it’s the best: Questions are harder than the actual exam, forcing you to truly understand concepts
  • Key feature: Detailed explanations for every answer
  • Usage tip: Aim for 85%+ on Enthuware to pass the real exam confidently

2. Whizlabs

Price: $30-$40
Questions: 500+ per exam
Accuracy: 90% match
Difficulty: Close to actual exam
  • Good variety of questions
  • Video explanations available
  • Mobile app for practice on the go

3. Udemy Practice Tests

  • Various authors (check ratings above 4.5)
  • Often on sale for $15-$20
  • Good for final week cramming

Online Courses

For Visual Learners:

  1. Udemy: “Java Certification” by Tim Buchalka
  • Comprehensive video lectures
  • 40+ hours of content
  • Includes practice questions
  • Best when on sale ($15-$20)

2. Pluralsight: Java Certification Paths

  • Structured learning paths
  • Skill assessments
  • $29/month or free trial

For Reading-Focused Learners:

  1. Oracle’s Official Tutorials

2. Baeldung (baeldung.com)

  • Excellent articles on specific topics
  • Real-world examples
  • Free

Community and Support

Forums and Study Groups:

  • CodeRanch Java Certification Forum: Active community of learners
  • Reddit r/learnjava: Great for specific questions
  • Stack Overflow: For technical problems

Study Strategy:

public class ResourceStrategy {
    public void optimalApproach() {
        // Phase 1: Foundation (Weeks 1-4)
        use(OfficialStudyGuide);
        supplement(UdemyCourse);

        // Phase 2: Practice (Weeks 5-8)
        use(Enthuware);
        review(OracleDocumentation);

        // Phase 3: Mastery (Weeks 9-12)
        use(EnthuwareDaily);
        take(WhizlabsMockTests);
        review(WeakTopics);
    }
}

3. Core Java Fundamentals Deep Dive

Let’s explore the foundational concepts that form the bedrock of both OCA and OCP exams. These are the topics where most candidates lose points unnecessarily.

Java Basics: Variables and Data Types

Primitive Types — Know Them Cold:

public class PrimitiveTypes {
    public static void main(String[] args) {
        // Integral types
        byte b = 127;          // 8-bit: -128 to 127
        short s = 32767;       // 16-bit: -32,768 to 32,767
        int i = 2147483647;    // 32-bit: -2^31 to 2^31-1
        long l = 9223372036854775807L; // 64-bit: -2^63 to 2^63-1

        // Floating-point types
        float f = 3.14f;       // 32-bit decimal
        double d = 3.14159;    // 64-bit decimal (default)

        // Other types
        char c = 'A';          // 16-bit Unicode character
        boolean bool = true;   // true or false only

        // Common exam traps
        // int x = 2147483648;    // Compilation error: too large
        long y = 2147483648L;     // OK with L suffix
        // float z = 3.14;        // Compilation error: needs f suffix
    }
}

Key Exam Topics:

  1. Default Values (for instance variables only):
public class DefaultValues {
    int number;          // 0
    double decimal;      // 0.0
    boolean flag;        // false
    String text;         // null
    Object obj;          // null

    public void display() {
        System.out.println(number);   // 0
        // int local;                  // local variables have NO default
        // System.out.println(local);  // Compilation error!
    }
}

2. Variable Scope:

public class VariableScope {
    private int instanceVar = 10;    // Instance variable

    public void method() {
        int localVar = 20;           // Local variable

        {
            int blockVar = 30;       // Block variable
            System.out.println(instanceVar); // OK
            System.out.println(localVar);    // OK
            System.out.println(blockVar);    // OK
        }

        // System.out.println(blockVar); // Compilation error!
    }

    public static void main(String[] args) {
        // System.out.println(instanceVar); // Compilation error! (static context)
    }
}

Operators and Expressions

Operator Precedence (High to Low):

public class OperatorPrecedence {
    public static void main(String[] args) {
        int result;

        // 1. Postfix: x++, x--
        int a = 5;
        result = a++;        // result = 5, a = 6

        // 2. Unary: ++x, --x, !
        int b = 5;
        result = ++b;        // result = 6, b = 6

        // 3. Multiplicative: *, /, %
        result = 10 + 5 * 2;  // 20, not 30

        // 4. Additive: +, -
        result = 10 - 5 + 3;  // 8 (left to right)

        // 5. Relational: <, >, <=, >=
        boolean flag = 5 > 3 && 2 < 4;

        // 6. Equality: ==, !=
        flag = 5 == 5;

        // 7. Logical AND: &&
        flag = true && false;   // false

        // 8. Logical OR: ||
        flag = true || false;   // true

        // 9. Assignment: =, +=, -=, etc.
        result += 5;

        // Common exam trap
        int x = 5;
        int y = x++ + ++x;  // x=5, then x=6, then x=7, y = 5 + 7 = 12
        System.out.println("x=" + x + ", y=" + y); // x=7, y=12
    }
}

Short-Circuit Evaluation:

public class ShortCircuit {
    public static void main(String[] args) {
        int x = 5;

        // && short-circuits: second part not evaluated if first is false
        if (x < 3 && ++x > 5) {
            System.out.println("Inside if");
        }
        System.out.println(x); // 5 (x was never incremented)

        // || short-circuits: second part not evaluated if first is true
        if (x > 3 || ++x > 5) {
            System.out.println("Inside if");
        }
        System.out.println(x); // 5 (x was never incremented)

        // & and | do NOT short-circuit
        if (x < 3 & ++x > 5) {
            System.out.println("Inside if");
        }
        System.out.println(x); // 6 (x WAS incremented)
    }
}

Control Flow Statements

If-Else Statements:

public class ControlFlow {
    public static void gradeEvaluation(int score) {
        // Single if
        if (score >= 90) {
            System.out.println("A grade");
        } else if (score >= 80) {
            System.out.println("B grade");
        } else if (score >= 70) {
            System.out.println("C grade");
        } else {
            System.out.println("Need improvement");
        }

        // Exam trap: dangling else
        int x = 10;
        if (x > 5)
            if (x < 15)
                System.out.println("Between 5 and 15");
        else  // This else belongs to the inner if!
            System.out.println("Greater than 15");
    }
}

Switch Statements (Know the Rules!):

public class SwitchStatement {
    public static void main(String[] args) {
        // Valid switch types: byte, short, char, int, String, enum
        int day = 3;

        switch (day) {
            case 1:
                System.out.println("Monday");
                break;
            case 2:
                System.out.println("Tuesday");
                break;
            case 3:
                System.out.println("Wednesday");
                // Fall-through! (no break)
            case 4:
                System.out.println("Thursday");
                break;
            default:
                System.out.println("Other day");
        }
        // Output: Wednesday, Thursday

        // String switch (Java 7+)
        String fruit = "apple";
        switch (fruit) {
            case "apple":
                System.out.println("Red fruit");
                break;
            case "banana":
                System.out.println("Yellow fruit");
                break;
        }

        // Exam traps
        final int constant = 5;
        // switch (day) {
        //     case constant: // OK - compile-time constant
        //     case day + 1:  // ERROR - must be constant
        // }
    }
}

Loops — All Three Types:

public class Loops {
    public static void main(String[] args) {
        // For loop
        for (int i = 0; i < 5; i++) {
            System.out.print(i + " ");
        }
        System.out.println();

        // Enhanced for loop (for-each)
        int[] numbers = {1, 2, 3, 4, 5};
        for (int num : numbers) {
            System.out.print(num + " ");
        }
        System.out.println();

        // While loop
        int count = 0;
        while (count < 5) {
            System.out.print(count + " ");
            count++;
        }
        System.out.println();

        // Do-while loop (executes at least once)
        int x = 10;
        do {
            System.out.print(x + " ");
            x++;
        } while (x < 10); // Still prints 10
        System.out.println();

        // Break and continue
        for (int i = 0; i < 10; i++) {
            if (i == 3) continue;  // Skip 3
            if (i == 7) break;     // Exit at 7
            System.out.print(i + " ");
        }
        // Output: 0 1 2 4 5 6
    }
}

4. Object-Oriented Programming Mastery

OOP concepts are heavily tested and form the foundation for advanced topics. Let’s master them systematically.

Classes and Objects

Class Structure:

// Complete class anatomy
public class Employee {
    // Static variable (class level)
    private static int employeeCount = 0;

    // Instance variables (object level)
    private String name;
    private int id;
    private double salary;

    // Static initializer block (runs once when class loads)
    static {
        System.out.println("Employee class loaded");
        employeeCount = 0;
    }

    // Instance initializer block (runs before constructor)
    {
        System.out.println("Creating new employee");
    }

    // Constructor
    public Employee(String name, int id, double salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
        employeeCount++;
    }

    // Instance method
    public void displayInfo() {
        System.out.println("Name: " + name + ", ID: " + id);
    }

    // Static method
    public static int getEmployeeCount() {
        return employeeCount;
        // Cannot access 'name' here - it's instance-level!
    }

    // Getters and Setters (Encapsulation)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name != null && !name.isEmpty()) {
            this.name = name;
        }
    }
}

Object Creation and Initialization Order:

public class InitializationOrder {
    private static int staticVar = initStatic();
    private int instanceVar = initInstance();

    static {
        System.out.println("3. Static block");
    }

    {
        System.out.println("5. Instance block");
    }

    public InitializationOrder() {
        System.out.println("6. Constructor");
    }

    private static int initStatic() {
        System.out.println("2. Static variable initialization");
        return 1;
    }

    private int initInstance() {
        System.out.println("4. Instance variable initialization");
        return 2;
    }

    public static void main(String[] args) {
        System.out.println("1. Main method start");
        new InitializationOrder();
        System.out.println("7. Object created");
    }
}

// Output order:
// 1. Main method start
// 2. Static variable initialization
// 3. Static block
// 4. Instance variable initialization
// 5. Instance block
// 6. Constructor
// 7. Object created

Inheritance

Inheritance Basics:

// Parent class
public class Animal {
    protected String name;
    private int age;  // Not inherited directly

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat() {
        System.out.println(name + " is eating");
    }

    public void sleep() {
        System.out.println(name + " is sleeping");
    }

    public int getAge() {
        return age;
    }
}

// Child class
public class Dog extends Animal {
    private String breed;

    public Dog(String name, int age, String breed) {
        super(name, age);  // Must be first line in constructor
        this.breed = breed;
    }

    // Method overriding
    @Override
    public void eat() {
        System.out.println(name + " the dog is eating dog food");
    }

    // New method specific to Dog
    public void bark() {
        System.out.println(name + " is barking");
    }

    public void displayInfo() {
        System.out.println("Name: " + name);  // OK - protected
        System.out.println("Age: " + getAge());  // Need getter for private
        System.out.println("Breed: " + breed);
    }
}

Method Overriding Rules (CRITICAL for Exam):

class Parent {
    // Original method
    protected Number calculate(int x) throws IOException {
        return x * 2;
    }
}

class Child extends Parent {
    // Valid override
    @Override
    public Integer calculate(int x) {  // ✓ Same or more accessible
        return x * 3;                   // ✓ Covariant return type
    }                                    // ✓ Same or fewer exceptions

    // INVALID overrides (won't compile):
    // private Number calculate(int x) { }     // ✗ Less accessible
    // Object calculate(int x) { }             // ✗ Incompatible return
    // Number calculate(int x) throws Exception { } // ✗ Broader exception
    // Number calculate(long x) { }            // ✗ Different parameter (overload, not override)
}

Polymorphism

Compile-Time vs Runtime Polymorphism:

public class PolymorphismDemo {
    static class Animal {
        public void makeSound() {
            System.out.println("Some sound");
        }

        public void eat() {
            System.out.println("Animal eating");
        }
    }

    static class Dog extends Animal {
        @Override
        public void makeSound() {
            System.out.println("Bark");
        }

        @Override
        public void eat() {
            System.out.println("Dog eating");
        }

        public void fetch() {
            System.out.println("Dog fetching");
        }
    }

    public static void main(String[] args) {
        // Reference type: Animal, Object type: Dog
        Animal myDog = new Dog();

        myDog.makeSound();  // "Bark" - Runtime polymorphism
        myDog.eat();        // "Dog eating" - Runtime polymorphism

        // myDog.fetch();   // Compilation error! fetch() not in Animal

        // Need to cast to access Dog-specific methods
        if (myDog instanceof Dog) {
            ((Dog) myDog).fetch();  // "Dog fetching"
        }

        // Key exam concept: method selection
        Animal animal1 = new Animal();
        Animal animal2 = new Dog();
        Dog dog = new Dog();

        animal1.makeSound();  // "Some sound"
        animal2.makeSound();  // "Bark" (runtime binding)
        dog.makeSound();      // "Bark"
    }
}

Encapsulation

Proper Encapsulation Implementation:

public class BankAccount {
    // Private fields
    private String accountNumber;
    private double balance;
    private String customerName;

    // Constructor with validation
    public BankAccount(String accountNumber, String customerName, double initialBalance) {
        if (accountNumber == null || accountNumber.isEmpty()) {
            throw new IllegalArgumentException("Account number cannot be empty");
        }
        if (initialBalance < 0) {
            throw new IllegalArgumentException("Initial balance cannot be negative");
        }

        this.accountNumber = accountNumber;
        this.customerName = customerName;
        this.balance = initialBalance;
    }

    // Controlled access through getters
    public String getAccountNumber() {
        return accountNumber;
    }

    public double getBalance() {
        return balance;
    }

    public String getCustomerName() {
        return customerName;
    }

    // Controlled modification through business logic
    public boolean deposit(double amount) {
        if (amount <= 0) {
            return false;
        }
        balance += amount;
        return true;
    }

    public boolean withdraw(double amount) {
        if (amount <= 0 || amount > balance) {
            return false;
        }
        balance -= amount;
        return true;
    }

    // No setter for balance - only through business methods!
    // No setter for accountNumber - immutable after creation

    public void setCustomerName(String customerName) {
        if (customerName != null && !customerName.isEmpty()) {
            this.customerName = customerName;
        }
    }
}

Conclusion of Part 2

You’ve now built a solid foundation with a personalized study plan, identified the best learning resources for your budget and learning style, and mastered core Java fundamentals including variables, operators, control flow, and OOP principles. These concepts form the backbone of both OCA and OCP exams.

In Part 2, we covered critical exam topics with practical code examples that mirror real certification questions. You learned not just the “what” but the “why” behind each concept, along with common exam traps to avoid.

This series continues in Part 3, where we’ll explore advanced OCP topics including generics, collections framework, lambda expressions, streams, concurrency, and I/O operations, along with proven exam-taking strategies and final preparation tips.

Tags/Keywords: java, certification, oca, ocp, study-plan, java-fundamentals, object-oriented-programming, programming, software-engineering, tutorial, exam-preparation

References:

If you enjoyed this content, consider supporting: **Buy Me a Coffee**

[embed]aedesium is developing things Hey I have created this page so you can buy me a coffee :)buymeacoffee.com


메타데이터
post_id
c078813b6572
slug
java-oca-ocp-certification-roadmap-a-complete-study-guide-from-beginner-to-expert-part-2-c078813b6572
url
https://medium.com/but-it-works-on-my-machine/java-oca-ocp-certification-roadmap-a-complete-study-guide-from-beginner-to-expert-part-2-c078813b6572
canonical_url
https://medium.com/but-it-works-on-my-machine/java-oca-ocp-certification-roadmap-a-complete-study-guide-from-beginner-to-expert-part-2-c078813b6572
author_url
https://medium.com/@aedemirsen
status
ok
fetched_at
2026-07-14 06:31:06