CSV import error "File test.json not found."

Your Setup:

  • Self-hosted
  • SeaTable Version (only necessary for self-hosted):
    5.3.12

Describe the Problem/Error/Question:

Importing CSV Files only work for either new tables or new Bases.

Importing into an existing tables (no matter the setup) fails with the error “File test.json not found.”.

I can reproduce that with a simple test.csv file using the “Table > Import new data from xIsx or csv file” function. Example:

Name,Land
Test GmbH,DE
Max Muster GmbH,DE
Max Muster Holding GmbH,DE

Browser Console:

16:40:51.848 XHRGET
https://domain.de/api/v2.1/workspace/1/excel-common/get-parsed-file/?file_name=test&dtable_uuid=7cca3366-c10d-437e-8876-78d8e2fc4109
[HTTP/2 404  1760ms]

	
GET
	https://domain.de/api/v2.1/workspace/1/excel-common/get-parsed-file/?file_name=test&dtable_uuid=7cca3366-c10d-437e-8876-78d8e2fc4109
Status
404
VersionHTTP/2
Transferred721 B (41 B size)
Referrer Policysame-origin
DNS ResolutionSystem

    	
    access-control-allow-headers
    	Content-Type, Accept, authorization, token, deviceType, x-seafile-otp
    access-control-allow-methods
    	GET,POST,PUT,DELETE,OPTIONS
    access-control-allow-origin
    	https://api.seatable.com
    allow
    	GET, HEAD, OPTIONS
    alt-svc
    	h3=":443"; ma=2592000
    content-language
    	en
    content-length
    	41
    content-type
    	application/json
    date
    	Mon, 04 Aug 2025 14:40:51 GMT
    referrer-policy
    	same-origin
    server
    	nginx
    strict-transport-security
    	max-age=31536000; includeSubdomains; preload
    vary
    	Accept-Language, Cookie
    via
    	1.1 Caddy
    x-content-type-options
    	nosniff
    X-Firefox-Spdy
    	h2
    x-frame-options
    	SAMEORIGIN
    x-xss-protection
    	1; mode=block
    	
    Accept
    	application/json, text/plain, */*
    Accept-Encoding
    	gzip, deflate, br, zstd
    Accept-Language
    	en-US,en;q=0.5
    Cache-Control
    	no-cache
    Connection
    	keep-alive
    Cookie
    	_ga_VJH9K6JM76=GS2.1.s1753689355$o59$g0$t1753689355$j60$l0$h0; _ga=GA1.1.329520291.1717596813; _tt_enable_cookie=1; _ttp=G5J4pQhcZQiJQlxvYhg0ByH3SXo.tt.1; intercom-device-id-lios09xl=18a04a48-75d3-4504-a13d-6d9afe8cef0b; amp_c96acd=IBlsaEL7MDeIqIpbX6CRZ8.amtAam9uYXNrcmFuemVyLmRl..1iqnplfrj.1iqnplfrj.1t.0.1t; _ga_MKRK559SRB=GS2.1.s1746702874$o8$g1$t1746702877$j0$l0$h0; amp_c96acd_domain.de=IBlsaEL7MDeIqIpbX6CRZ8.amtAam9uYXNrcmFuemVyLmRl..1idkckuos.1idkcmvb9.1j.0.1j; intercom-id-lios09xl=01344911-8bab-429…WSe0J8lc8IqnstRLS7Jx8NcakHo_posthog=%7B%22distinct_id%22%3A%22d160e539d2f1a627c61dec8128071eca3529ebaa5ae124b8b92c197acd24da57%23d618c897-535c-4bfd-a798-71582f31d5f8%22%2C%22%24sesid%22%3A%5B1754298171873%2C%2201987451-c1e2-7a65-b092-b8337347927c%22%2C1754298171873%5D%2C%22%24epp%22%3Atrue%2C%22%24initial_person_info%22%3A%7B%22r%22%3A%22%24direct%22%2C%22u%22%3A%22https%3A%2F%2Fn8n.domain.de%2Fsetup%22%7D%7D; dtable_csrftoken=cqlNynpIWxVcPiVfIkfsCThVIaaPjo4I; sessionid=lux6tpp8gn8hnzzjttnvvtgbwwecoggm
    DNT
    	1
    Host
    	domain.de
    Pragma
    	no-cache
    Referer
    	https://domain.de/workspace/1/dtable/test/?tid=Z9E2&vid=0000
    Sec-Fetch-Dest
    	empty
    Sec-Fetch-Mode
    	cors
    Sec-Fetch-Site
    	same-origin
    TE
    	trailers
    User-Agent
    	Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:141.0) Gecko/20100101 Firefox/141.0
    X-CSRFToken
    	cqlNynpIWxVcPiVfIkfsCThVIaaPjo4I

I’m not sure if that’s related to caddy, because that’s the only thing I changed in my setup, because I already have a caddy service running on my server, so I didn’t use the provided lucaslorentz/caddy-docker-proxy container.

This is my caddy config, so I ported all the labels to a normal Caddyfile. Caddy also doesn’t show any errors, so I guess it’s correct (also import to a new table or new base is working correct).


# allow only local network
(external_block) {
	@not_local not remote_ip 192.168.1.0/24 100.64.0.0/24 127.0.0.1/8 ::1/128 2606:6d00:167:7d00::/64 fe80::/10
	respond @not_local 403
}

https://domain.de {
	import external_block
	tls internal

	reverse_proxy seatable-server:80 {
		flush_interval -1
	}

	# Security headers
	header {
		Strict-Transport-Security "max-age=31536000; includeSubdomains; preload"
		Referrer-Policy "same-origin"
		X-XSS-Protection "1; mode=block"
		X-Content-Type-Options "nosniff"
		X-Frame-Options "SAMEORIGIN"
		Set-Cookie "(.*)" "$1; SameSite=None; Secure"
		Content-Security-Policy `
			block-all-mixed-content;
			default-src 'none';
			style-src 'unsafe-inline' 'self';
			script-src 'unsafe-inline' 'unsafe-eval' 'self';
			script-src-elem 'unsafe-inline' 'self' domain.de:6233 maps.googleapis.com unpkg.com;
			font-src 'self' data: unpkg.com cdn.tldraw.com;
			img-src 'self' data: blob: https: market.seatable.io market.seatable.com mt0.google.com maps.googleapis.com maps.gstatic.com;
			media-src 'self';
			form-action 'self' domain.de:6232;
			connect-src 'self' market.seatable.io market.seatable.com https: ws: blob: data:;
			frame-src 'self' domain.de:6232 domain.de:6233;
			frame-ancestors 'self';
			worker-src 'self' blob:;
			manifest-src 'self';
			object-src 'self';
			base-uri 'self'
		`
	}

	# Allow iframes for specific routes
	route /dtable/view-external-links/* {
		header X-Frame-Options "ALLOWALL"
		header -Content-Security-Policy
		reverse_proxy seatable-server:80
	}

	route /dtable/external-links/* {
		header X-Frame-Options "ALLOWALL"
		header -Content-Security-Policy
		reverse_proxy seatable-server:80
	}

	route /dtable/external-apps/* {
		header X-Frame-Options "ALLOWALL"
		header -Content-Security-Policy
		reverse_proxy seatable-server:80
	}

	route /dtable/forms/* {
		header X-Frame-Options "ALLOWALL"
		header -Content-Security-Policy
		reverse_proxy seatable-server:80
	}

	route /apps/custom/* {
		header X-Frame-Options "ALLOWALL"
		header -Content-Security-Policy
		reverse_proxy seatable-server:80
	}

	route /external-apps/* {
		header X-Frame-Options "ALLOWALL"
		header -Content-Security-Policy
		reverse_proxy seatable-server:80
	}
}
# HTTP to HTTPS redirect for Seatable
http://domain.de {
	redir https://{host}{uri} permanent
}

Any help welcome.

@s3n can you check whether a view’s “export to Excel“ works?

Also doesn’t work. (also 404 error in the console)

@s3n thought so. I had this problem before, but am struggling to remember what caused it.

On a very superficial level, I remember that Seatable internally calls a special microservice in the import / export functions, and that service fails.

As I said, I’m trying to remember why that happend to me. At the off-chance that you suffer from the same circumstances that I do: Are you working internally with self-signed certificates or an internal corporate CA and internal Domain to generate your server Certificates? About 60% of my non-standard problem come from there.

What do the following logs say:

  • /opt/seatable/logs/dtable_events_data_sync.log
  • /opt/seatable/logs/dtable_web.log

Yes, it’s a self-signed certificate from caddy, and I allowed the caddy CA cert on my device.

  • dtable_events_data_sync.log: is empty
  • dtable_web.log
[2025-08-05 12:24:21] [WARNING] log.py[line:241] Not Found: /api/v2.1/workspace/1/dtable/test/export-table-to-excel/
[2025-08-05 12:24:37] [WARNING] log.py[line:241] Not Found: /api/v2.1/workspace/1/dtable/test/export-table-to-excel/
[2025-08-05 13:36:11] [WARNING] log.py[line:241] Not Found: /api/v2.1/workspace/1/excel-common/get-parsed-file/
[2025-08-05 13:39:49] [WARNING] log.py[line:241] Not Found: /api/v2.1/workspace/1/excel-common/get-parsed-file/

edit: just found this in the manual: Custom Certificates - SeaTable Admin Manual so you might be right. Maybe I’ll just add basic auth instead. even though I would be more comfortable knowing I can just have it run in my private network and use a self signed cert.

edit2: found a way to use caddy and cloudflare dns challenges. I’ll try that approach to get proper ssl certs.

@abaer so I switched to an official lets encrypt cert but the issue still persists. Also after restarting the seatable container.

I just found the original post where I reported my CA-specific problem and the solution I found:

Central to my problem was the fact that at that time (5.2.7 - don’t know whether that changed in the meanwhile), a few custom components used their own certificate chains. Now, that might be obsolete by the REQUESTS_CA_BUNDLE environment variable.

However, with the 404 error, I doubt that this is your problem. I’m still quite certain that at the bottom of your problem, there is the basic mechanism that seatable internally calls a service which imports / exports Excel / CSV files. But other than my CA problem, I guess in your case the reason might be your custom caddy configuration, which may not serve all API endpoints. Just a wild guess and general feeling, because I’m running Traefik instead.

In your case, I would probably first make the seatable-provided Caddy installation run smoothly, and then transfer it piece by piece into your own Caddy. Or run Caddy behind Caddy. Sorry I can’t help with this, because I don’t run Caddy.

Unrelated comment: Seatable must also trust its own certificate / CA. For that matter, using an official LE certificate was the right move to eliminate that potential error. It might have hit you after you’ve solved the 404 problem.