The crawl_id field in the URL data records is None instead of the expected crawl UUID. This may be a free-tier API limitation where some fields are stripped, or a timing issue if the data was read before post-processing completed. Detail: crawl_ids={None}
The crawler does not set the canonical_not_match_url flag on canonical-fragment.html. The canonical tag value (https://nginx-website-for-test.ttfb.ovh/seo-tests/canonical-fragment.html#section1) does not match the page URL, yet the crawler reports canonical_not_match_url=False. This means pages with incorrect canonical tags will not be flagged in SEO audits.
The URL Explorer page does not contain the text 'Filter' or 'Add Filter' in the visible page body. The filter controls may be rendered as icon-only buttons (e.g. a funnel icon) without text labels, or inside a dropdown that isn't expanded. The filter functionality itself is likely present — this is a test selector issue, not a product bug.
The URL Explorer page does not contain the text 'Columns' in the visible page body. The column selector is likely rendered as a gear/settings icon or a dropdown toggle without a visible text label. The columns API (/api/v1/crawl/columns/{id}) correctly returns 71 column definitions, confirming the backend works. This is a test detection limitation, not a product bug.
| Status | Test | Details |
|---|---|---|
| ✓ PASS | Crawl status is 'completed' | status=completed |
| ✓ PASS | is_complete flag is True | is_complete=True |
| ✓ PASS | completed_at timestamp exists | completed_at=Fri, 03 Apr 2026 14:45:22 GMT |
| ✓ PASS | Processing event 'deployment' completed | |
| ✓ PASS | Processing event 'crawl' completed | |
| ✓ PASS | Processing event 'read_crawl_data' completed | |
| ✓ PASS | Processing event 'calculating_inlinks' completed | |
| ✓ PASS | Processing event 'calculating_pagerank' completed | |
| ✓ PASS | Processing event 'find_duplicate' completed | |
| ✓ PASS | Processing event 'canonical_and_redirect_lists' completed | |
| ✓ PASS | Processing event 'saving_results' completed | |
| ✓ PASS | All events have status=completed | |
| ✓ PASS | Crawl completed within 5 minutes | total=178s |
| ✓ PASS | Server deploy time < 5 minutes | deploy=160s |
| ✓ PASS | Crawl duration (190 URLs) < 120s | crawl=18s |
| Status | Test | Details |
|---|---|---|
| ✓ PASS | Crawl report page loads | |
| ✓ PASS | URL count displayed as 190 | 190 not found in page text |
| ✓ PASS | Site URL shown in header | |
| ✓ PASS | Sidebar nav: 'Overview' visible | |
| ✓ PASS | Sidebar nav: 'Indexability' visible | |
| ✓ PASS | Sidebar nav: 'Content' visible | |
| ✓ PASS | Sidebar nav: 'Links' visible | |
| ✓ PASS | Sidebar nav: 'Web Performance' visible | |
| ✓ PASS | Sidebar nav: 'Sitemaps' visible | |
| ✓ PASS | Sidebar nav: 'Bulk Exports' visible | |
| ✓ PASS | URL Explorer link visible | |
| ✓ PASS | 'Project Home' link exists | |
| ✓ PASS | Timeline shows deployment event | timeline mentions deploy |
| ✓ PASS | URL Explorer shows data table | |
| ✓ PASS | URL Explorer shows 190 URLs count | |
| ✓ PASS | URL Explorer has Export button | |
| ✗ FAIL | URL Explorer has filter controls | |
| ✗ FAIL | URL Explorer has Columns selector |
| Status | Test | Details |
|---|---|---|
| ✓ PASS | Projects page shows project name |
| Status | Test | Details |
|---|---|---|
| ✓ PASS | Exports page loads | |
| ✓ PASS | Exports API returns list | type= |
| Status | Test | Details |
|---|---|---|
| ✓ PASS | Status API reports url_count=190 | url_count=190 |
| ✓ PASS | Data API reports recordsTotal=190 | recordsTotal=190 |
| ✓ PASS | Data API returns records (free tier: 10) | got=10 |
| ✓ PASS | Crawl date has url_count=190 | url_count=190 |
| Status | Test | Details |
|---|---|---|
| ✓ PASS | Protocol = https | protocol=https |
| ✓ PASS | URL = nginx-website-for-test.ttfb.ovh | url=nginx-website-for-test.ttfb.ovh |
| ✓ PASS | crawl_sitemaps enabled | |
| ✓ PASS | calculate_pagerank enabled | |
| ✓ PASS | crawl_alternate (hreflang) enabled | |
| ✓ PASS | crawl_redirect enabled | |
| ✓ PASS | JS rendering disabled | |
| ✓ PASS | Cookies disabled | |
| ✓ PASS | User agent is desktop | ua=desktop |
| Status | Test | Details |
|---|---|---|
| ✓ PASS | Project name = nginx-test-site | name=nginx-test-site |
| ✓ PASS | Project crawl ID present | crawl_ids=['461d879a-8ead-4e5c-b65c-e890216342dc', '692354b5-0571-4690-8248-e37314a56e19', 'f86b84ae-fa69-424e-8a04-ec7515125950'] |
| ✓ PASS | Profile email correct | email=quentin.adt+qa-test@gmail.com |
| ✓ PASS | Profile has user_id | |
| ✓ PASS | Profile quota_limit set | quota_limit=100 |
| ✓ PASS | Project URLs list has entry | urls=[{'id': '461d879a-8ead-4e5c-b65c-e890216342dc', 'url': 'https://nginx-website-for-test.ttfb.ovh'}] |
| Status | Test | Details |
|---|---|---|
| ✓ PASS | Columns endpoint returns data | count=67 |
| ✓ PASS | Column 'url' available | |
| ✓ PASS | Column 'status' available | |
| ✓ PASS | Column 'depth' available | |
| ✓ PASS | Column 'title' available | |
| ✓ PASS | Column 'title_length' available | |
| ✓ PASS | Column 'meta_description' available | |
| ✓ PASS | Column 'meta_description_length' available | |
| ✓ PASS | Column 'h1_first' available | |
| ✓ PASS | Column 'h1_first_length' available | |
| ✓ PASS | Column 'canonical_link_tag' available | |
| ✓ PASS | Column 'pagerank' available | |
| ✓ PASS | Column 'wordcount' available | |
| ✓ PASS | Column 'text_ratio_percent' available | |
| ✓ PASS | Column 'ttfb' available | |
| ✓ PASS | Column 'size' available | |
| ✓ PASS | Column 'indexable_bool' available | |
| ✓ PASS | Column 'follow' available | |
| ✓ PASS | Column 'found_in_sitemaps' available | |
| ✓ PASS | Column 'img_count' available | |
| ✓ PASS | Column 'imgs_without_alt' available | |
| ✓ PASS | Column 'hreflang_count' available | |
| ✓ PASS | Column 'num_inlinks_unique' available | |
| ✓ PASS | Column 'num_outlinks_unique' available |
| Status | Test | Details |
|---|---|---|
| ✓ PASS | Field 'url' in all sample records | 10/10 |
| ✓ PASS | Field 'status' in all sample records | 10/10 |
| ✓ PASS | Field 'depth' in all sample records | 10/10 |
| ✓ PASS | Field 'title' in all sample records | 10/10 |
| ✓ PASS | Field 'h1_first' in all sample records | 10/10 |
| ✓ PASS | Field 'indexable_bool' in all sample records | 10/10 |
| ✓ PASS | Field 'follow' in all sample records | 10/10 |
| ✓ PASS | Field 'ttfb' in all sample records | 10/10 |
| ✓ PASS | Field 'size' in all sample records | 10/10 |
| ✓ PASS | Field 'wordcount' in all sample records | 10/10 |
| ✓ PASS | Field 'pagerank' in all sample records | 10/10 |
| ✓ PASS | Field 'found_in_sitemaps' in all sample records | 10/10 |
| ✓ PASS | All sample records are status 200 | statuses=[200, 200, 200, 200, 200, 200, 200, 200, 200, 200] |
| ✓ PASS | All sample records have TTFB | 10/10 |
| ✓ PASS | Average TTFB < 1s | avg=0.039s, max=0.079s |
| ✓ PASS | Pagerank calculated for all samples | 10/10 |
| ✓ PASS | All samples have size > 0 | 10/10 |
| ✓ PASS | All samples from correct hostname | hostnames={'nginx-website-for-test.ttfb.ovh'} |
| ✗ FAIL | All samples have correct crawl_id | crawl_ids={None} |
| ✓ PASS | Record types valid: og-missing.html | status=int, depth=int |
| ✓ PASS | Record types valid: canonical-fragment.html | status=int, depth=int |
| ✓ PASS | Record types valid: title-missing.html | status=int, depth=int |
| ✓ PASS | Record types valid: organic-chemistry.html | status=int, depth=int |
| ✓ PASS | Record types valid: street-art.html | status=int, depth=int |
| ✓ PASS | Record types valid: h1-missing.html | status=int, depth=int |
| ✓ PASS | Record types valid: national-parks.html | status=int, depth=int |
| ✓ PASS | Record types valid: meta-desc-good.html | status=int, depth=int |
| ✓ PASS | Record types valid: title-empty.html | status=int, depth=int |
| ✓ PASS | Record types valid: wine-and-cheese.html | status=int, depth=int |
| Status | Test | Details |
|---|---|---|
| ✓ PASS | Title extracted: og-missing.html | title_length=29, actual=29 |
| ✓ PASS | H1 extracted: og-missing.html | h1_length=23, actual=23 |
| ✓ PASS | Meta desc extracted: og-missing.html | md_length=33, actual=33 |
| ✓ PASS | Canonical match check: og-missing.html | canonical=https://nginx-website-for-test.ttfb.ovh/seo-tests/og-missing.html, match=True, flag=False |
| ✓ PASS | Title extracted: canonical-fragment.html | title_length=29, actual=29 |
| ✓ PASS | H1 extracted: canonical-fragment.html | h1_length=28, actual=28 |
| ✓ PASS | Meta desc extracted: canonical-fragment.html | md_length=47, actual=47 |
| ✗ FAIL | Canonical match check: canonical-fragment.html | canonical=https://nginx-website-for-test.ttfb.ovh/seo-tests/canonical-fragment.html#section1, match=False, flag=False |
| ✓ PASS | H1 extracted: title-missing.html | h1_length=18, actual=18 |
| ✓ PASS | Meta desc extracted: title-missing.html | md_length=30, actual=30 |
| ✓ PASS | Canonical match check: title-missing.html | canonical=https://nginx-website-for-test.ttfb.ovh/seo-tests/title-missing.html, match=True, flag=False |
| ✓ PASS | Title extracted: organic-chemistry.html | title_length=51, actual=51 |
| ✓ PASS | H1 extracted: organic-chemistry.html | h1_length=17, actual=17 |
| ✓ PASS | Title extracted: street-art.html | title_length=44, actual=44 |
| ✓ PASS | H1 extracted: street-art.html | h1_length=10, actual=10 |
| ✓ PASS | Title extracted: h1-missing.html | title_length=21, actual=21 |
| ✓ PASS | Meta desc extracted: h1-missing.html | md_length=29, actual=29 |
| ✓ PASS | Canonical match check: h1-missing.html | canonical=https://nginx-website-for-test.ttfb.ovh/seo-tests/h1-missing.html, match=True, flag=False |
| ✓ PASS | Title extracted: national-parks.html | title_length=48, actual=48 |
| ✓ PASS | H1 extracted: national-parks.html | h1_length=14, actual=14 |
| ✓ PASS | Title extracted: meta-desc-good.html | title_length=39, actual=39 |
| ✓ PASS | H1 extracted: meta-desc-good.html | h1_length=33, actual=33 |
| ✓ PASS | Meta desc extracted: meta-desc-good.html | md_length=132, actual=132 |
| ✓ PASS | Canonical match check: meta-desc-good.html | canonical=https://nginx-website-for-test.ttfb.ovh/seo-tests/meta-desc-good.html, match=True, flag=False |
| ✓ PASS | H1 extracted: title-empty.html | h1_length=16, actual=16 |
| ✓ PASS | Meta desc extracted: title-empty.html | md_length=34, actual=34 |
| ✓ PASS | Canonical match check: title-empty.html | canonical=https://nginx-website-for-test.ttfb.ovh/seo-tests/title-empty.html, match=True, flag=False |
| ✓ PASS | Title extracted: wine-and-cheese.html | title_length=49, actual=49 |
| ✓ PASS | H1 extracted: wine-and-cheese.html | h1_length=15, actual=15 |
| Status | Test | Details |
|---|---|---|
| ✓ PASS | Insights endpoint returns ok | ok=True |
| ✓ PASS | Insights contains sections | count=14 |
| ✓ PASS | Insights have titled sections | titles=['All', 'Security', 'URLs Containing Non-standard Characters', 'Status Codes', 'Page Titles', 'Status code by Depth', 'Meta Description', 'H1', 'Canonical', 'Directives Robots', 'Hreflang', 'Pagination', 'Images', 'Performance'] |
| ✓ PASS | Insights: total URLs = 188+ | urls=188 |
| ✓ PASS | Sidebar nav: 'Insights' visible |
| Status | Test | Details |
|---|---|---|
| ✓ PASS | Dates endpoint returns ok | |
| ✓ PASS | Crawl date entries exist | count=3 |
| ✓ PASS | Crawl date has correct ID | |
| ✓ PASS | Crawl date shows sitemaps enabled |
| Timestamp | Pass Rate | Passed | Failed | URLs | Total Time | Crawl ID |
|---|---|---|---|---|---|---|
| 2026-04-03 14:49 UTC | 97.3% | 142 | 4 | 190 | 178s | 461d879a... |
| 2026-04-03 14:19 UTC | 98.0% | 145 | 3 | 190 | 289s | f86b84ae... |